From 229ce1f7f9fa5505a337dfc7331600752b94f678 Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@dtu.dk>
Date: Mon, 13 Feb 2023 13:20:23 +0100
Subject: [PATCH] updates

---
 setup.py                                      |   2 +-
 src/coursebox.egg-info/PKG-INFO               |   2 +-
 src/coursebox/book/irlc_main.py.pclprof       |   2 +-
 src/coursebox/core/info.py                    |  68 +++++++---
 .../material/homepage_lectures_exercises.py   | 123 ++----------------
 5 files changed, 61 insertions(+), 136 deletions(-)

diff --git a/setup.py b/setup.py
index 4939390..650818d 100644
--- a/setup.py
+++ b/setup.py
@@ -15,7 +15,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
 # beamer-slider
 setuptools.setup(
     name="coursebox",
-    version="0.1.13",
+    version="0.1.15",
     author="Tue Herlau",
     author_email="tuhe@dtu.dk",
     description="A course management system currently used at DTU",
diff --git a/src/coursebox.egg-info/PKG-INFO b/src/coursebox.egg-info/PKG-INFO
index 1ee6aab..12bfe3c 100644
--- a/src/coursebox.egg-info/PKG-INFO
+++ b/src/coursebox.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: coursebox
-Version: 0.1.13
+Version: 0.1.15
 Summary: A course management system currently used at DTU
 Home-page: https://lab.compute.dtu.dk/tuhe/coursebox
 Author: Tue Herlau
diff --git a/src/coursebox/book/irlc_main.py.pclprof b/src/coursebox/book/irlc_main.py.pclprof
index a970559..6aa5540 100644
--- a/src/coursebox/book/irlc_main.py.pclprof
+++ b/src/coursebox/book/irlc_main.py.pclprof
@@ -1 +1 @@
-{"profiledFunctions": [{"file": "/home/tuhe/Documents/02465public/pythontools/irlc_box/material/student_files.py", "lineNo": 19, "functionName": "setup_student_files", "profiledLines": []}], "unit": 1e-09}
\ No newline at end of file
+{"profiledFunctions": [{"file": "/home/tuhe/Documents/02465public/pythontools/irlc_box/material/student_files.py", "lineNo": 19, "functionName": "setup_student_files", "profiledLines": []}], "unit": 1e-06}
\ No newline at end of file
diff --git a/src/coursebox/core/info.py b/src/coursebox/core/info.py
index 5074b65..ae7d4b3 100644
--- a/src/coursebox/core/info.py
+++ b/src/coursebox/core/info.py
@@ -204,24 +204,41 @@ def lectures(info, pensum=None):
         l['date'] = d
         l['preceded_by_holiday'] = i == holiday
         if not continuing_education():
+            ehw = int(info.get('extraordinary_holiday_week', -1))
+            if 'extraordinary_holiday_week' in info and int(lecture_info[i]['number']) == int(info['extraordinary_holiday_week']) and ehw == 13:
+
+                dow = int(info['day_of_week'])
+                if dow == 4:  # friday
+                    d2 = d + timedelta(days=4)  #
+                    l['month'] = d2.strftime('%B')
+                    l['day'] = d2.day
+                    l['date'] = d2
+                    l['extraordinary'] = True
+
             d = d + ow
+
+
             if i == holiday - 1: d = d + ow
             if d.month == 5 and d.day == 8: # grundlovsdag
                 d += timedelta(days=4)
+
+
         else:
             d = d + timedelta(days=dd[i-0] if i > 1 else 0)
             d = d.replace(hour=ice['hour'][i-1], minute=ice['minute'][i-1])
 
-        info = lecture_info[i]
 
-        ir = info.get('reading', "")
-        info['reading_long'] = ir.replace("C", "Chapter ") if ir else ""
 
-        hwp =  info['homework_problems']
-        info['homework_problems_long'] = hwp.replace("P", "Problem ") if hwp else ""
-        if info["learning_objectives"]:
-            info["learning_objectives"] = [s.strip() for s in info["learning_objectives"].split("\n")]
-        l.update(info)
+        linfo = lecture_info[i]
+
+        ir = linfo.get('reading', "")
+        linfo['reading_long'] = ir.replace("C", "Chapter ") if ir else ""
+
+        hwp =  linfo['homework_problems']
+        linfo['homework_problems_long'] = hwp.replace("P", "Problem ") if hwp else ""
+        if linfo["learning_objectives"]:
+            linfo["learning_objectives"] = [s.strip() for s in linfo["learning_objectives"].split("\n")]
+        l.update(linfo)
         lectures.append(l)
     return lectures, pensum
 
@@ -255,7 +272,6 @@ def class_information():
     continuing_education_mode = core_conf['continuing_education_mode']
     faq = xlsx_to_dicts(paths['information.xlsx'], sheet='faq')
 
-
     d = {'year': year(),
          'piazza': piazza, # deprecated.
          'course_number': course_number,
@@ -300,19 +316,8 @@ def class_information():
             for cmd, aux, display in zip(ls(gi['tex_command']), ls(gi['tex_aux']), ls(gi['tex_display'])):
                 cm = dict(command=cmd, aux=get_aux(paths['02450public'] + "/"+aux), output=display)
                 cmds.append(cm)
-
-                # ax = parse_aux(aux, bibtex=gi['bibtex'])
-                # for k in ax:
-                #     ax[k]['pyref'] = display % (ax[k]['nicelabel'],)
-                # newref[cmd] = ax
         d['references'] = dict(bibtex=bibtex, commands=cmds)
 
-        # references = dict(bibtex=bibtex,
-        #                   # aux=auxfile,
-        #                   commands=[dict(command='\\aref2', output="(Assignment 2, %s)", aux=auxfile),
-        #                             dict(command='\\nref', output="\cite[%s]{herlau}", aux=auxfile),
-        #                             ])
-
 
     else:
         print("[info]", "No bibtex rereferences specified. Check configuration file. ")
@@ -350,6 +355,29 @@ def class_information():
 
     d['teams'] = xlsx_to_dicts(paths['information.xlsx'], sheet='teams')
     fix_instructor_comma(d['teams'], d['instructors'])
+
+    if 'reports_delta' in d:
+        print(234)
+
+    if 'handin_day_delta' in d:
+        d['reports_info'] = {}
+        for k, r in enumerate(d['reports_handin']):
+            ri = {}
+            d['reports_info'][r] = ri
+            # print(d['lectures'][r-1]['date'], r)
+            nd = d['lectures'][r-1]['date'] + timedelta(days=int(d['handin_day_delta']))
+            ri['date'] = nd
+            ri['html'] = f"{nd.day} {nd.strftime('%b')}"
+            ab = 'st'
+            if nd.day == 2:
+                ab = "nd"
+            elif nd.day == 3:
+                ab = 'rd'
+            elif nd.day >= 4:
+                ab = 'th'
+            ri['latex_long'] = f"{nd.strftime('%A')} {nd.day}{ab} {nd.strftime('%B')}, {nd.year}"
+            ri['latex_short'] = f"{nd.strftime('%B')} {nd.day}{ab}, {nd.year}"
+            d['reports_info'][k] = ri
     return d
 
 def fix_instructor_comma(dd, instructors):
diff --git a/src/coursebox/material/homepage_lectures_exercises.py b/src/coursebox/material/homepage_lectures_exercises.py
index 769964c..3eeeeeb 100644
--- a/src/coursebox/material/homepage_lectures_exercises.py
+++ b/src/coursebox/material/homepage_lectures_exercises.py
@@ -311,7 +311,7 @@ def fix_shared(paths, output_dir, pdf2png=False,dosvg=True,verbose=False, compil
 
         if rel not in target or target[rel]['hash'] != source[rel]['hash']:
             _ensure_target_dir_exists( output_dir + "/" + rel)
-            print(" -> ", output_dir + "/" + rel)
+            print("[fix shared] -> ", output_dir + "/" + rel)
             shutil.copy(shared_base +"/" + rel, output_dir + "/" + rel)
             target[rel] = source[rel].copy()
             target[rel]['modified'] = True
@@ -332,115 +332,6 @@ def fix_shared(paths, output_dir, pdf2png=False,dosvg=True,verbose=False, compil
     with open(output_dir + "/sharedcache.pkl", 'wb') as f:
         pickle.dump(target, f)
 
-    print("fix_shared()", time.time() - t0)
-
-    #
-    # if pdf2png:
-    #     if f.endswith(".pdf") and pdf2png:
-    #         if verbose:
-    #             print("converting to png", f)
-    #         convert.pdf2png(of)
-    #
-    #     for f in source:
-    #         if f not in target:
-    #             print(f)
-    #         else:
-    #             if source[f]['hash'] != target[f]['hash']:
-    #                 print(f, f)
-    #
-    #
-    #
-    # a = 234
-    # # if rel not in source:
-    #
-    #     #     source[rel] = dict(mtime=os.path.getmtime(f), hash=hash_file_(f))
-    #     #
-    #
-    #
-    # # Everything has a hash/mtime that is up to date. Now look at target dir
-    #
-    # get_cache_from_dir(output_dir)
-    #
-    # # Get the corresponding output at destination:
-    #
-    #
-    #
-    #
-    #
-    #
-    # for path in Path(shared_base).rglob('*'):
-    #     print(path)
-    # a = 234
-    # def rec_fix_shared(shared_base, output_dir):
-    #     if dosvg:
-    #         for svg in glob.glob(shared_base+"/*.svg"):
-    #             # if not os.path.exists(shared_base + )
-    #             if not cache_contains_file(cache_base, svg):
-    #                 # if verbose:
-    #                 print("converting to pdf", svg)
-    #                 svg2pdf(svg,crop=True, text_to_path=True)
-    #                 cache_update_file(cache_base, svg)
-    #                 assert False
-    #
-    #     files = glob.glob(shared_base+"/*")
-    #     for f in files:
-    #         if f.endswith("cache.pkl"):
-    #             continue
-    #
-    #         if "templates" in f and f.endswith("_partial.tex"):
-    #             continue
-    #
-    #         if os.path.isdir(f):
-    #             od2 = output_dir + "/" + os.path.basename(f)
-    #             if not os.path.exists(od2):
-    #                 os.mkdir(od2)
-    #             rec_fix_shared(f, od2)
-    #         else:
-    #             of = output_dir + "/" + os.path.basename(f)
-    #             if not os.path.exists(of) or not filecmp.cmp(f, of,shallow=shallow):
-    #                 print(f"> fix_shared() -> {of}")
-    #                 shutil.copy(f, of)
-    #                 if f.endswith(".pdf") and pdf2png:
-    #                     if verbose:
-    #                         print("converting to png", f)
-    #                     convert.pdf2png(of)
-    #                 # cache_update_file(cache_base, f)
-    #
-    #         if verbose:
-    #             print(" done!")
-
-    # if pdf2png:
-    #     assert False
-
-
-
-    # get diff.
-
-    # directory_cmp = filecmp.dircmp(a=paths['shared'], b=output_dir)
-    # from filecmp import dircmp
-    # from filecmp import dircmp
-    # def print_diff_files(dcmp):
-    #     for name in dcmp.diff_files:
-    #         print("diff_file %s found in %s and %s" % (name, dcmp.left, dcmp.right))
-    #         print("")
-    #     for sub_dcmp in dcmp.subdirs.values():
-    #         print_diff_files(sub_dcmp)
-    #
-
-    # t0 = time.time()
-    # dcmp = dircmp(paths['shared'], output_dir)
-    # print_diff_files(dcmp)
-    # print("dircmp", time.time() - t0)
-    # directory_cmp.report()
-    # import time
-    # t0 = time.time()
-    # rec_fix_shared(shared_base=paths['shared'], output_dir=output_dir)
-    # import time
-    # # import dirsync
-    # # dirsync.sync(paths['shared'], output_dir, 'diff')
-    # print("mine", time.time() - t0)
-    a = 234
-
 
 def jinjafy_shared_templates_dir(paths, info):
     tpd = paths['shared'] + "/templates"
@@ -556,24 +447,30 @@ def mvfiles(source_dir, dest_dir):
             shutil.copy(full_file_name, os.path.dirname(dest_dir))
 
 # @profile
-def make_webpage(dosvg=True):
+def make_webpage(dosvg=True, upload=True):
     cinfo = class_information()
     paths = get_paths()
     fix_shared(paths, output_dir=os.path.dirname(paths['homepage_out']), pdf2png=True, dosvg=dosvg)
     wdir = paths['homepage_template']
-    jinjafy_template(cinfo, file_in=wdir, file_out=paths['homepage_out'])
+
+
     print("Instructors for course: ")
     s = ""
     for dex,i in enumerate(cinfo['instructors']):
         if dex > 0:
             s += "; "
         s += i['email']
+        cinfo['instructors'][dex]['ok'] = i['email'] not in [t['email'] for t in cinfo['teachers'] ]
 
+    jinjafy_template(cinfo, file_in=wdir, file_out=paths['homepage_out'])
     blrb = os.path.dirname(paths['homepage_template']) +"/homepage_widget_blurb_template.html"
     if os.path.exists( blrb):
         jinjafy_template(cinfo, file_in=blrb, file_out=blrb.replace("_template.html", ".html"))
-    print(s)
 
+    if upload:
+        import subprocess
+        cmd = f"cd {os.path.dirname(paths['homepage_template'] )} && rsync --delete --rsh=ssh -av ./ tuhe@thinlinc.compute.dtu.dk:/www/docs/courses/02465/"
+        subprocess.run([cmd], shell=True)
 
 # This should probably  be moved into jinjafy
 def tt(value):
-- 
GitLab