diff options
-rw-r--r-- | core/utils.py | 26 | ||||
-rw-r--r-- | core/views/expo.py | 4 | ||||
-rw-r--r-- | core/views/survex.py | 44 | ||||
-rw-r--r-- | templates/svxfile.html | 1 |
4 files changed, 55 insertions, 20 deletions
diff --git a/core/utils.py b/core/utils.py index a251ba0..161a7f6 100644 --- a/core/utils.py +++ b/core/utils.py @@ -42,7 +42,7 @@ Read this now: https://nerderati.com/a-python-epoch-timestamp-timezone-trap/ TROG = {"pagecache": {"expedition": {}}, "caves": {"gcavelookup": {}, "gcavecount": {}}} alphabet = [] sha = hashlib.new('sha256') - +COOKIE_MAX_AGE = 12*60*60 # seconds throw = 35.0 class DatabaseResetOngoing(Exception): @@ -191,22 +191,31 @@ def parse_aliases(aliasfile): return [(None, None)], "Fail on file reading" return aliases, report -def only_commit(fname, message): +def only_commit(fname, message, editor=None): """Only used to commit a survex file edited and saved in view/survex.py""" git = settings.GIT cwd = fname.parent filename = fname.name # print(f'{fname=} ') - + if editor: + editor = git_string(editor) + else: + # cannot happen as form verification has this as an obligatory field + editor = "Anathema Device <a.device@potatohut.expo>" + try: + print(f"git add {filename}") cp_add = subprocess.run([git, "add", filename], cwd=cwd, capture_output=True, text=True) if cp_add.returncode != 0: msgdata = f"Ask a nerd to fix this problem in only_commit().\n--{cp_add.stderr}\n--{cp_add.stdout}\n--return code:{str(cp_add.returncode)}" raise WriteAndCommitError( f"CANNOT git ADD on server for this file {filename}. Edits saved but not added to git.\n\n" + msgdata ) - - cp_commit = subprocess.run([git, "commit", "-m", message], cwd=cwd, capture_output=True, text=True) + print(f"git commit {filename}") + print(f"Committing:\n{message=}\n{editor=}") + cmd_commit = [git, "commit", "-m", message, "--author", f"{editor}"] + + cp_commit = subprocess.run(cmd_commit, cwd=cwd, capture_output=True, text=True) # This produces return code = 1 if it commits OK, but when the local repo still needs to be pushed to origin/loser # which will be the case when running a test troggle system on a development machine devok_text = """On branch master @@ -229,9 +238,10 @@ nothing to commit, working tree clean ) except subprocess.SubprocessError: - raise WriteAndCommitError( - f"CANNOT git COMMIT on server for this file {filename}. Subprocess error. Edits not saved.\nAsk a nerd to fix this." - ) + msg = f"CANNOT git COMMIT on server for this file {filename}. Subprocess error. Edits not saved.\nAsk a nerd to fix this." + print(msg) + raise WriteAndCommitError(msg) + def git_string(author_string): """Rewrites the supplied editor string intoa git-complient author string diff --git a/core/views/expo.py b/core/views/expo.py index 3fd6ddc..3cba48b 100644 --- a/core/views/expo.py +++ b/core/views/expo.py @@ -14,7 +14,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie import troggle.core.views.caves import troggle.settings as settings from troggle.core.models.caves import Cave -from troggle.core.utils import WriteAndCommitError, current_expo, git_string, write_and_commit +from troggle.core.utils import COOKIE_MAX_AGE, WriteAndCommitError, current_expo, git_string, write_and_commit from troggle.core.views.editor_helpers import HTMLarea from troggle.core.views.uploads import edittxtpage @@ -26,7 +26,7 @@ Then it was incorporated into troggle directly, rather than being an unnecessary This is a succession of hacks and needs to be redisgned and refactored. """ -COOKIE_MAX_AGE = 12*60*60 # seconds + default_head = """<head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>CUCC Expedition - index</title> diff --git a/core/views/survex.py b/core/views/survex.py index aae2c0c..56d447f 100644 --- a/core/views/survex.py +++ b/core/views/survex.py @@ -19,7 +19,7 @@ from troggle.core.models.caves import Cave, GetCaveLookup from troggle.core.models.logbooks import LogbookEntry from troggle.core.models.survex import SurvexBlock, SurvexFile #, SurvexDirectory from troggle.core.models.wallets import Wallet -from troggle.core.utils import current_expo, only_commit +from troggle.core.utils import COOKIE_MAX_AGE, current_expo, git_string, only_commit from troggle.parsers.survex import parse_one_file """Everything that views survexfiles @@ -43,7 +43,7 @@ todo = """ SVXPATH = Path(settings.SURVEX_DATA) # NB this template text must be identical to that in :loser:/templates/template.svx -survextemplatefile = """; *** THIS IS A TEMPLATE FILE NOT WHAT YOU MIGHT BE EXPECTING *** +survextemplatefile = """; *** THIS IS A TEMPLATE FILE - NOT WHAT YOU MIGHT BE EXPECTING *** *** DO NOT SAVE THIS FILE WITHOUT RENAMING IT !! *** ;[Stuff in square brackets is example text to be replaced with real data, @@ -152,6 +152,12 @@ class SvxForm(forms.Form): datetime = forms.DateTimeField(widget=forms.TextInput(attrs={"readonly": True})) outputtype = forms.CharField(widget=forms.TextInput(attrs={"readonly": True})) code = forms.CharField(widget=forms.Textarea(attrs={"cols": 140, "rows": 36})) + who_are_you = forms.CharField( + widget=forms.TextInput( + attrs={"size": 100, "placeholder": "You are editing this page, who are you ? e.g. 'Animal <mta@gasthof.expo>'", + "style": "vertical-align: text-top;"} + ) + ) survexfile = models.ForeignKey(SurvexFile, blank=True, null=True, on_delete=models.SET_NULL) # 1:1 ? template = False @@ -187,7 +193,7 @@ class SvxForm(forms.Form): difflist = [diffline.strip() for diffline in difftext if not re.match(r"\s*$", diffline)] return difflist - def SaveCode(self, rcode): + def SaveCode(self, rcode, editor): fname = SVXPATH / (self.data["filename"] + ".svx") if not fname.is_file(): if re.search(r"\[|\]", rcode): @@ -214,7 +220,7 @@ class SvxForm(forms.Form): "CANNOT save this file.\nPERMISSIONS incorrectly set on server for this file. Ask a nerd to fix this." ) - # javascript seems to insert CRLF on WSL1 whatever you say. So fix that: + # HTML forms standard behaviour is to insert CRLF whatever you say. So fix that: fout.write(rcode.replace("\r", "")) fout.write("\n") fout.close() @@ -223,9 +229,10 @@ class SvxForm(forms.Form): comment = f"Online survex edit: {self.data['filename']}.svx" else: comment = f"Online survex edit: {self.data['filename']}.svx on dev machine '{socket.gethostname()}' " - only_commit(fname, comment) + print(f"Committing file which has been saved {editor=}") + only_commit(fname, comment, editor) - msg = "SAVED and committed to git (if there were differences)" + msg = f"SAVED and committed to git (if there were differences)\nEdited by:{editor}" # should only call this is something changed if parse_one_file(self.data["filename"]): return msg @@ -284,6 +291,8 @@ def svx(request, survex_file): Needs refactoring. Too many piecemeal edits and odd state dependencies. + Why is all the action code in this Class ?! Confusing.. + On Get does the SAME THING as svxcavesingle but is called when the .svx suffix is MISSING """ warning = False @@ -299,7 +308,13 @@ def svx(request, survex_file): dirname += "/" nowtime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") outputtype = "normal" - form = SvxForm({"filename": survex_file, "dirname": dirname, "datetime": nowtime, "outputtype": outputtype}) + + print(f"Reading cookie...") + editor_id = request.COOKIES.get('editor_id', 'speleologist') # if no cookie, then default string + editor = git_string(editor_id) # belt and braces, should have been validity checked on saving already + print(f"Cookie read: {editor_id=} reformatted as: {editor=}") + + form = SvxForm({"filename": survex_file, "dirname": dirname, "datetime": nowtime, "outputtype": outputtype, "who_are_you":editor}) # if the form has been returned difflist = [] @@ -309,6 +324,7 @@ def svx(request, survex_file): if request.method == "POST": # If the form has been submitted... rform = SvxForm(request.POST) # if rform.is_valid(): # All validation rules pass (how do we check it against the filename and users?) + editor = rform.cleaned_data["who_are_you"] rcode = rform.cleaned_data["code"] outputtype = rform.cleaned_data["outputtype"] # used by CodeMirror ajax I think difflist = form.DiffCode(rcode) @@ -335,7 +351,9 @@ def svx(request, survex_file): if "save" in rform.data: if request.user.is_authenticated: if difflist: - message = form.SaveCode(rcode) + editor = rform.cleaned_data["who_are_you"] + print(f"Saving code and editor id {editor=}") + message = form.SaveCode(rcode, editor) else: message = "NO DIFFERENCES - so not saving the file" else: @@ -395,6 +413,7 @@ def svx(request, survex_file): events = events_on_dates(svxblocks) year = year_for_svx(svxblocks) + form.data['who_are_you'] = editor vmap = { "year": year, "settings": settings, @@ -412,9 +431,14 @@ def svx(request, survex_file): } if outputtype == "ajax": # used by CodeMirror ajax I think - return render(request, "svxfiledifflistonly.html", vmap) + edit_response = render(request, "svxfiledifflistonly.html", vmap) + else: + edit_response = render(request, "svxfile.html", vmap) + + edit_response.set_cookie('editor_id', editor, max_age=COOKIE_MAX_AGE) # cookie expires after COOKIE_MAX_AGE seconds + print(f"Cookie reset: {editor} for another {COOKIE_MAX_AGE/3600} hours") - return render(request, "svxfile.html", vmap) + return edit_response SameDateEvents = namedtuple('SameDateEvents', ['trips', 'svxfiles', 'wallets', 'blocks']) diff --git a/templates/svxfile.html b/templates/svxfile.html index 8c2d367..48dffe2 100644 --- a/templates/svxfile.html +++ b/templates/svxfile.html @@ -54,6 +54,7 @@ $(document).ready(function() <form id="codewikiform" action="" method="POST">{% csrf_token %} <div class="codeframebit">{{form.code}}</div> + <div>Who are you? {{form.who_are_you}}</div> <div style="display:none">{{form.filename}} {{form.dirname}} {{form.datetime}} {{form.outputtype}}</div> <input type="submit" name="diff" value="Differences between edited and saved versions of this file" /> <input type="submit" name="save" value="Save this edited svx file"/> |