From a996edbc652fb7a1573ab335d947d678ec9b29a0 Mon Sep 17 00:00:00 2001 From: Ville Rantanen Date: Sat, 15 Dec 2018 16:16:13 +0200 Subject: [PATCH] support for delayed opening. css changes --- abot.py | 22 +++++++++---- questions/examples/multi_question.txt | 2 ++ static/favicon.png | Bin 0 -> 1025 bytes static/hk-grotesk.regular.ttf | Bin 0 -> 87624 bytes static/style.css | 44 ++++++++++++++++++++------ templates/layout.html | 2 +- templates/preview.html | 8 +++-- templates/vote.html | 30 ++++++++++++------ utils.py | 35 ++++++++++++++------ 9 files changed, 107 insertions(+), 36 deletions(-) create mode 100644 static/favicon.png create mode 100644 static/hk-grotesk.regular.ttf diff --git a/abot.py b/abot.py index 2b842cf..91bcfeb 100644 --- a/abot.py +++ b/abot.py @@ -43,12 +43,14 @@ def preview(key): return render_template('blank.html', message = "Error creating form") if not is_draft(form): return render_template('blank.html', message = "Preview not enabled") - valid_for = time_to_expiry(form) + valid_for = time_to('expires', form) + opens = time_to('opens', form) return render_template( 'preview.html', key = key, form = form, - valid_for = valid_for + valid_for = valid_for, + opens = opens ) @@ -62,14 +64,19 @@ def vote(key, token = None): return render_template('blank.html', message = "Error creating form") if is_draft(form): return render_template('blank.html', message = "Not published") - if is_expired(form): - return render_template('blank.html', message = "Voting has closed") if is_closed_vote(form): if not is_voter(key, token): return render_template('blank.html', message = "Token invalid") if has_voted(key, token): - return render_template('blank.html', message = "Token already used") - valid_for = time_to_expiry(form) + form['can_submit'] = False + form['message'] = 'Token used. Can not submit anymore' + if not is_opened(form): + return render_template('blank.html', message = "Voting is not open yet. Opens at " + time_to('opens', form)) + + if is_expired(form): + form['can_submit'] = False + form['message'] = 'Voting has closed. Can not submit anymore' + valid_for = time_to('expires', form) return render_template( 'vote.html', @@ -98,6 +105,9 @@ def save_vote(): return render_template('blank.html', message = "Token invalid") if has_voted(key, token): return render_template('blank.html', message = "Token already used") + if not is_opened(form): + return render_template('blank.html', message = "Voting is not open yet. Opens at " + time_to('opens', form)) + write_vote(key, token, request.form, form) # using request. tokens = False diff --git a/questions/examples/multi_question.txt b/questions/examples/multi_question.txt index 9ec2896..7d59865 100644 --- a/questions/examples/multi_question.txt +++ b/questions/examples/multi_question.txt @@ -1,6 +1,8 @@ +title: My Vote # expiry format: YYYY-MM-DD HH:MM +z # z is the difference to UTC in HHMM, +0000, -0700, etc.. expires: 2028-12-12 21:20 +0200 +opens: 2010-12-12 21:20 +0200 # if "draft: true" voting is not possible. you can preview the form with address "/preview/example" draft: false diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..edde4d2a5069cf17123923c4c125d1a12967658c GIT binary patch literal 1025 zcmV+c1pfPpP)!| z#b(CWTo6TwK^Zvr+&`zYNlvT3z&9T=qnnKivWX0+ zV*!x_0+9p)JdOa}HjV%-O=AcI8X83)@J^!$1WEy*kHG{0N}~uuLltSDAK+^M(48QJ zNN}PCAy~scvXDJMr|+i)obd!{qcK=l?$CruLrP^r_DF)MVcM_e8AmWReCSOr2sjOM z4X6g#6J`zChf>4A)EEMR>m&i!Fn=A?SsrcllTL&H4fjSuya}ccE12~3CYTy><2$8^ z7l9Z)OifcOLXGla1{Z3F#~Mrx3*)<11*0MB@>{_A8jNix(9Z5(SJKchGd$@{Fg3Jn z!eQe|17-C}dl!UMoIG-J03PbiDnYgra&aYc^+bT`>t7*>)T5^O za5|x=*9r0xmlqe!XwKWO9Yfti2d0cnswN*bT4G69-d85p}wR-@CP{5vix0dyKv?n#SE zWLM4#(O9Sa%xI-ySi)u7$Ic4?-NEY3eSE5bvF)1ZuZ6hP)a z9mY`kdIk$fxVSudJs#Qh@%YvrMLd-lfG#9*6(}nYfW6MfG~_$3Z7 zNU*g619<2^(hsYkpAY~gK?+v*`QS&tc6D)Lx0KQsu*);&+`kSWWdfJNIr91dC~H|0 z1<1ht_~iu|_Z*Hg=cuJs((C-v`i_=_Jm5-~$-T+NTxn6*R{wnA-t^2Cv4& zFnb+Hi&a25dqMKw0Z!k5e;go-fAz9m4tCHjVg`5TIsw300000NkvXXu0mjfT06C8 literal 0 HcmV?d00001 diff --git a/static/hk-grotesk.regular.ttf b/static/hk-grotesk.regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8e48d00fcb6581238c017ac9b99486e5ed839fbb GIT binary patch literal 87624 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

A2Xbfs{V z(C^fruqx?lp@a0}9P41EpQalETBH(GtSOT@jhD6OV_d0u+H_852P>_Jm8T7=%VZRX z4rjm0{QoVb8z&{$|C7b+Z{Ek&or+~2$rn59>Dj;re5KI$%FC!-E!Z40_Dj#2feUWI z1q*uF<1z&+e6C2Bu*zRKrF|2_ne%gW8Jw?5dI`m=?8O?~E$TRp``-GR9*IIXL8#&nWxYj%v0!F%v0#wJZBBGi05Pw^PCKJc}@l`=DZBhW)6cr<}kR&90uP} zdR2kGtMp>@J*5|;?<>6+{Xpr(=!Z%#Mn6(|F?v(!#pphKygmrvTdGDI5WKD7O~7~9 z=}aRJwFfwB0h#lzhRpe~;;?`@KSAefgHeB~YO2S+hTP+48Z!Oo80VTE@)sI1;g=dR z;aA{ZAB^{FRa4`=ry!tcSoF&OWCRa4{rK|`khQA4Ib zLeCp|ybm;FLPtX;d?>qP>Jpc7Ru^B`UBlfI&a%)e(C{9mmzw+i1Ks5_7B_?c*v6%$ z`DYw=`u6Xw#2E4pmhfFptBf8$GmMWUjcRP?@G)-2Bi<*uhZ%nFW(>74?-OGKzg+tm z@6{O9WXXKAg`0y%0oU8rWQFU8!-j4!s-cxU&rN?HeuxJ}HXgNh6cYmed2Hoo(y7VS aL-X_ZDf1_s)767)8y{S%veH-t`1uzI^h41A literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css index 1c660d5..b1251dd 100644 --- a/static/style.css +++ b/static/style.css @@ -1,12 +1,28 @@ -body { font-family: sans-serif; background: #eee; } -a, h1, h2 { color: #227b64; } -h1, h2 { font-family: 'Georgia', serif; margin: 0; margin-top: 0.9em; } -h1 { border-bottom: 2px solid #eee; } -h2 { font-size: 1.2em; } -input { margin-top: 0.5em; border: 1px solid gray;} +@font-face { + font-family: HK Grotesk; + src: url('hk-grotesk.regular.ttf'); +} -.page { margin: 2em auto; width: 90%; border: 3px solid #ccc; - padding: 0.8em; background: white; } +body { font-family: 'HK Grotesk', sans-serif; background: #eee; } +a, h1, h2 { color: #227b64; } +h1, h2 { font-family: 'HK Grotesk', sans-serif; margin: 0; margin-top: 0.9em; } +h1 { border-bottom: 2px solid #eee; text-align: center; } +h2 { font-size: 1.2em; } + +input { + margin-top: 0.8em; +} +input[type=submit] { + border: 1px solid #333; + border-radius: 2px; + font-size: 1.0em; + padding: 8px; +} + +.page { + margin: 2em auto; width: 90%; border: 1px solid #ccc; + padding: 0.8em; background: white; +} .index { margin-top: 1em; } @@ -18,7 +34,7 @@ input { margin-top: 0.5em; border: 1px solid gray;} padding-bottom: 0.5em; } .autoformat { - border-bottom: 1px solid gray; + border-bottom: 1px solid #ccc; } .warning { font-size: small; @@ -29,6 +45,13 @@ input { margin-top: 0.5em; border: 1px solid gray;} color: red; margin-top: 1em; margin-bottom: 1em; + width: 100%; + background-color: #eee; + text-align: center; + padding: 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } textarea { @@ -72,3 +95,6 @@ textarea { text-align: center; padding: 3px; } +.submit { + text-align: center; +} diff --git a/templates/layout.html b/templates/layout.html index 9182972..70e9495 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -2,8 +2,8 @@ aBot // {{ g.title|safe }} + - diff --git a/templates/preview.html b/templates/preview.html index 4858fed..5f862ba 100644 --- a/templates/preview.html +++ b/templates/preview.html @@ -1,8 +1,12 @@ {% extends "layout.html" %} {% block body %} -

+
Preview for: {{ key|safe }}
- Expires: {{ valid_for }}
+ Voting ends at: {{ valid_for }}
+ Voting starts at: {{ opens }}
+ Style (open/closed): {{ form.vote_style }}
+ Show results after voting: {{ form.show_results }}
+ Title: {{ form.title }}
{% include "questions.html" %} diff --git a/templates/vote.html b/templates/vote.html index 0d49060..91e17a1 100644 --- a/templates/vote.html +++ b/templates/vote.html @@ -1,21 +1,33 @@ {% extends "layout.html" %} {% block body %} + {% if not form.can_submit %} +
{{ form.message }}
+ {% endif %} + + {% if valid_for != 'Never' %}
Voting ends at: {{ valid_for }}
+ {% endif %}
{% include "questions.html" %}

-
- {% if form.vote_style == 'closed' %} -

- You can only vote once! -
    -
  • Votes can not be edited later
  • -
  • Empty choices counts as empty, used vote
  • -
-
+ {% if form.can_submit %} +
+ +
+ {% if form.vote_style == 'closed' %} +
+ You can only vote once! +
    +
  • Votes can not be edited later
  • +
  • Empty choices counts as empty, used vote
  • +
+
+ {% endif %} + {% else %} +
{{ form.message }}
{% endif %}

diff --git a/utils.py b/utils.py index 9ebde5c..fca63c3 100644 --- a/utils.py +++ b/utils.py @@ -131,10 +131,15 @@ def is_draft(form): def is_expired(form): if form['expires'] == None: return False - return datetime.now(timezone.utc) > form['expires'] +def is_opened(form): + if form['opens'] == None: + return True + return datetime.now(timezone.utc) > form['opens'] + + def is_key(key, cli_opts = False): key = secure_filename(key) @@ -171,11 +176,14 @@ def is_voter(key, token): def parse_form(key): form = { 'expires': None, + 'opens': None, 'draft': False, 'vote_style': "closed", 'show_results': False, 'questions': [], - 'title': "" + 'title': "", + 'can_submit': True, + 'message': '' } key = secure_filename(key) try: @@ -194,6 +202,9 @@ def parse_form(key): if rowsl.startswith("expires: "): form['expires'] = parse_row_date(row) continue + if rowsl.startswith("opens: "): + form['opens'] = parse_row_date(row) + continue if rowsl.startswith("draft: "): if rowsl == "draft: true": form['draft'] = True @@ -225,7 +236,7 @@ def parse_form(key): 'choices': [], 'multichoices': [], 'index': current_question + 1, - 'name': row.strip().rstrip("_:").rstrip(), + 'name': row.strip().rstrip("_").rstrip(), 'open_question': row.strip().endswith("___"), 'autoformat': not rowsl.startswith("<") }) @@ -237,7 +248,7 @@ def parse_form(key): def parse_row_date(row): - row = row[9:].strip() + row = " ".join(row.split(" ")[1:]).strip() if row.lower() == "none": return None try: @@ -304,12 +315,18 @@ def sort_summary(questions, answers): return questions, sorted_answer_list -def time_to_expiry(form): - if form['expires'] == None: - return "Never" +def time_to(what, form): + if not what in ('expires','opens'): + raise AttributeError("Dont know that attribute") - time_to_go = form['expires'] - datetime.now(timezone.utc) + if form[what] == None: + if what == 'expires': + return "Never" + if what == 'opens': + return "None" + + time_to_go = form[what] - datetime.now(timezone.utc) time_to_go = ".".join(str(time_to_go).split('.')[0:-1])[0:-3] #time_to_go.microseconds = 0 - return "%s (%s to go)"%( form['expires'], time_to_go ) + return "%s (%s to go)"%( form[what], time_to_go )