added form to submit questions via mail
This commit is contained in:
		
							parent
							
								
									cf59ff986f
								
							
						
					
					
						commit
						c19ded10b1
					
				
					 7 changed files with 116 additions and 17 deletions
				
			
		
							
								
								
									
										10
									
								
								config.ini
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								config.ini
									
										
									
									
									
								
							|  | @ -3,7 +3,11 @@ port = 5000 | ||||||
| bind = 0.0.0.0 | bind = 0.0.0.0 | ||||||
| base_url = https://ab.21x9.org | base_url = https://ab.21x9.org | ||||||
| timezone = Europe/Berlin | timezone = Europe/Berlin | ||||||
| mail = abgame@21x9.org | mailform = false | ||||||
|  | mailserver = localhost:25 | ||||||
|  | mailto = abgame@21x9.org | ||||||
|  | mailfrom = abgame@21x9.org | ||||||
|  | mailsubject = A/B Game Questions | ||||||
| separator_char = ; | separator_char = ; | ||||||
| theme = dark | theme = dark | ||||||
| animations = 1 | animations = 1 | ||||||
|  | @ -20,3 +24,7 @@ questions_prefix = Es gibt derzeit | ||||||
| questions_suffix = Fragen. | questions_suffix = Fragen. | ||||||
| send_questions = Einreichen! | send_questions = Einreichen! | ||||||
| desc = Ein simples Entweder/Oder-Entscheidungsspiel | desc = Ein simples Entweder/Oder-Entscheidungsspiel | ||||||
|  | submit = Absenden | ||||||
|  | submit_questions = <p>Bitte gib deine Fragenvorschläge in das untenstehende Feld ein.</p><p>Wenn du mir einen Gefallen tun möchtest, gib die Vorschläge im Format "A;B" an und schreibe immer nur ein Fragenpaar in eine Zeile.</p><p>Danke!</p> | ||||||
|  | submit_thanks_title = Danke! | ||||||
|  | submit_thanks = <p>Vielen Dank für die Einsendung.</p> | ||||||
|  |  | ||||||
							
								
								
									
										49
									
								
								game.py
									
										
									
									
									
								
							
							
						
						
									
										49
									
								
								game.py
									
										
									
									
									
								
							|  | @ -1,8 +1,10 @@ | ||||||
| #! /bin/python3 | #! /bin/python3 | ||||||
| 
 | 
 | ||||||
| from flask import Flask, render_template | from flask import Flask, render_template, request | ||||||
| from configparser import ConfigParser | from configparser import ConfigParser | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
|  | from email.message import EmailMessage | ||||||
|  | import smtplib | ||||||
| import random | import random | ||||||
| import pytz | import pytz | ||||||
| 
 | 
 | ||||||
|  | @ -25,16 +27,27 @@ i18n = { | ||||||
|     'separator': config.get('i18n', 'separator'), |     'separator': config.get('i18n', 'separator'), | ||||||
|     'mailtext': config.get('i18n', 'mail_link'), |     'mailtext': config.get('i18n', 'mail_link'), | ||||||
|     'helptext': config.get('i18n', 'help_link'), |     'helptext': config.get('i18n', 'help_link'), | ||||||
|     'help': config.get('i18n', 'help') |     'help': config.get('i18n', 'help'), | ||||||
|  |     'submit': config.get('i18n', 'submit'), | ||||||
|  |     'submit_questions': config.get('i18n', 'submit_questions'), | ||||||
|  |     'submit_thanks_title': config.get('i18n', 'submit_thanks_title'), | ||||||
|  |     'submit_thanks': config.get('i18n', 'submit_thanks') | ||||||
| } | } | ||||||
| conf = { | conf = { | ||||||
|     'separator_char': config.get('main', 'separator_char'), |     'separator_char': config.get('main', 'separator_char'), | ||||||
|     'mailto': config.get('main', 'mail'), |     'mailform': config.get('main', 'mailform').lower(), | ||||||
|  |     'mailserver': config.get('main', 'mailserver'), | ||||||
|  |     'mailto': config.get('main', 'mailto'), | ||||||
|  |     'mailfrom': config.get('main', 'mailfrom'), | ||||||
|  |     'mailsubject': config.get('main', 'mailsubject'), | ||||||
|     'url': config.get('main', 'base_url'), |     'url': config.get('main', 'base_url'), | ||||||
|     'theme': config.get('main', 'theme'), |     'theme': config.get('main', 'theme'), | ||||||
|     'animations': config.get('main', 'animations') |     'animations': config.get('main', 'animations') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | with open("ab.txt", "r") as f: | ||||||
|  |     num_lines = sum(1 for _ in f) | ||||||
|  | 
 | ||||||
| def getEpoch(): | def getEpoch(): | ||||||
|     now = datetime.now(tz=tz) |     now = datetime.now(tz=tz) | ||||||
|     epoch = now.timestamp() |     epoch = now.timestamp() | ||||||
|  | @ -52,6 +65,33 @@ def internal_server_error(e): | ||||||
|     epoch = getEpoch() |     epoch = getEpoch() | ||||||
|     return render_template('500.html', config=conf, i18n=i18n, epoch=epoch), 500 |     return render_template('500.html', config=conf, i18n=i18n, epoch=epoch), 500 | ||||||
| 
 | 
 | ||||||
|  | if conf['mailform'] == "true": | ||||||
|  |     @app.route("/form") | ||||||
|  |     def mailform(): | ||||||
|  |         epoch = getEpoch() | ||||||
|  |         return render_template('mailform.html', config=conf, i18n=i18n, epoch=epoch, num_lines=num_lines) | ||||||
|  | 
 | ||||||
|  |     @app.route("/send", methods=['POST', 'GET']) | ||||||
|  |     def sendmail(): | ||||||
|  |         epoch = getEpoch() | ||||||
|  | 
 | ||||||
|  |         if request.method == 'POST': | ||||||
|  |             mailcontent = request.form['questions'] | ||||||
|  |         else: | ||||||
|  |             mailcontent = request.args.get('questions') | ||||||
|  | 
 | ||||||
|  |         message = EmailMessage() | ||||||
|  |         message.set_content(mailcontent) | ||||||
|  |         message['Subject'] = conf['mailsubject'] | ||||||
|  |         message['From'] = conf['mailfrom'] | ||||||
|  |         message['To'] = conf['mailto'] | ||||||
|  | 
 | ||||||
|  |         smtp_server = smtplib.SMTP(conf['mailserver']) | ||||||
|  |         smtp_server.send_message(message) | ||||||
|  |         smtp_server.quit() | ||||||
|  | 
 | ||||||
|  |         return render_template('thanks.html', config=conf, i18n=i18n, epoch=epoch, questions=mailcontent) | ||||||
|  | 
 | ||||||
| @app.route("/") | @app.route("/") | ||||||
| def hello(): | def hello(): | ||||||
|     ablines = [] |     ablines = [] | ||||||
|  | @ -69,9 +109,6 @@ def hello(): | ||||||
|             {'A': str(ab[0]), 'B': str(ab[1])} |             {'A': str(ab[0]), 'B': str(ab[1])} | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|     with open("ab.txt", "r") as f: |  | ||||||
|         num_lines = sum(1 for _ in f) |  | ||||||
| 
 |  | ||||||
|     return render_template('index.html', content=ablines, config=conf, i18n=i18n, num_lines=num_lines, epoch=epoch) |     return render_template('index.html', content=ablines, config=conf, i18n=i18n, num_lines=num_lines, epoch=epoch) | ||||||
| 
 | 
 | ||||||
| def getContent(): | def getContent(): | ||||||
|  |  | ||||||
|  | @ -48,6 +48,14 @@ a:hover #help { | ||||||
|     transform: translate(-50%); |     transform: translate(-50%); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | textarea { | ||||||
|  |     height: 250px; | ||||||
|  |     width: 100%; | ||||||
|  |     background-color: var(--bg-b); | ||||||
|  |     color: var(--fg-b); | ||||||
|  |     border: 1px solid var(--bg-a); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #background { | #background { | ||||||
|     overflow: hidden; |     overflow: hidden; | ||||||
|     position: absolute; |     position: absolute; | ||||||
|  | @ -98,6 +106,10 @@ a:hover #help { | ||||||
|     transform: translate(-50%, -50%); |     transform: translate(-50%, -50%); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .form { | ||||||
|  |     padding: 20px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .ab { | .ab { | ||||||
|     float: none; |     float: none; | ||||||
|     border-radius: 10px; |     border-radius: 10px; | ||||||
|  |  | ||||||
|  | @ -7,9 +7,6 @@ | ||||||
| 
 | 
 | ||||||
| <head> | <head> | ||||||
|     <title>{{ title }}</title> |     <title>{{ title }}</title> | ||||||
|     <script type="text/javascript" src="/js/toggle.js?t={{ epoch }}"></script> |  | ||||||
|     <script type="text/javascript" src="/js/autoReload.js?t={{ epoch }}"></script> |  | ||||||
|     <script type="text/javascript" src="/js/shortcut.js?t={{ epoch }}"></script> |  | ||||||
|     <link rel="stylesheet" type="text/css" href="/css/base.css?t={{ epoch }}"> |     <link rel="stylesheet" type="text/css" href="/css/base.css?t={{ epoch }}"> | ||||||
|     <link rel="stylesheet" type="text/css" href="/css/colors.css?t={{ epoch }}"> |     <link rel="stylesheet" type="text/css" href="/css/colors.css?t={{ epoch }}"> | ||||||
|     {%- if config.animations == "1" or config.animations == "true" %} |     {%- if config.animations == "1" or config.animations == "true" %} | ||||||
|  | @ -41,11 +38,6 @@ | ||||||
|             {%- endblock %} |             {%- endblock %} | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|     <script type="text/javascript"> |  | ||||||
|         initToggle(); |  | ||||||
|         autoReload(); |  | ||||||
|         monitorRadio(); |  | ||||||
|     </script> |  | ||||||
| </body> | </body> | ||||||
| 
 | 
 | ||||||
| </html> | </html> | ||||||
|  | @ -1,6 +1,10 @@ | ||||||
| {% extends 'base.html' %} | {% extends 'base.html' %} | ||||||
| 
 | 
 | ||||||
| {% block main %} | {% block main %} | ||||||
|  |         <script type="text/javascript" src="/js/toggle.js?t={{ epoch }}"></script> | ||||||
|  |         <script type="text/javascript" src="/js/autoReload.js?t={{ epoch }}"></script> | ||||||
|  |         <script type="text/javascript" src="/js/shortcut.js?t={{ epoch }}"></script> | ||||||
|  | 
 | ||||||
|         {%- set id = namespace(value=0) %} |         {%- set id = namespace(value=0) %} | ||||||
|         {%- for question in content %} |         {%- for question in content %} | ||||||
|         {%- set id.value = id.value + 1 %} |         {%- set id.value = id.value + 1 %} | ||||||
|  | @ -17,7 +21,9 @@ | ||||||
|             <div id="questions"> |             <div id="questions"> | ||||||
|                 {{ i18n.questions_prefix }} {{ num_lines }} {{ i18n.questions_suffix }} |                 {{ i18n.questions_prefix }} {{ num_lines }} {{ i18n.questions_suffix }} | ||||||
|                 <br> |                 <br> | ||||||
|                 <a href="mailto:{{ config.mailto }}">{{ i18n.mailtext }}</a> -  |                 {%- if config.mailform == "true" %} | ||||||
|  |                 <a href="/form">{{ i18n.mailtext }}</a> -  | ||||||
|  |                 {%- endif %} | ||||||
|                 <a href="#">{{ i18n.helptext }} |                 <a href="#">{{ i18n.helptext }} | ||||||
|                     <div id="help"> |                     <div id="help"> | ||||||
|                         {{ i18n.help|safe }} |                         {{ i18n.help|safe }} | ||||||
|  | @ -30,4 +36,10 @@ | ||||||
|                 <button id="next" type="submit">{{ i18n.more }}</button> |                 <button id="next" type="submit">{{ i18n.more }}</button> | ||||||
|             </form> |             </form> | ||||||
|         </div> |         </div> | ||||||
| {% endblock %} | 
 | ||||||
|  |         <script type="text/javascript"> | ||||||
|  |             initToggle(); | ||||||
|  |             autoReload(); | ||||||
|  |             monitorRadio(); | ||||||
|  |         </script> | ||||||
|  |         {% endblock %} | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								templates/mailform.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								templates/mailform.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | {% extends 'base.html' %} | ||||||
|  | 
 | ||||||
|  | {% block main %} | ||||||
|  | <form action="/send" method="post"> | ||||||
|  |     <input type="hidden" name="t" value="{{ epoch }}"> | ||||||
|  |     <div class="ab"> | ||||||
|  |         <div class="form"> | ||||||
|  |             <div><label for="questions">{{ i18n.submit_questions | safe }}</label></div> | ||||||
|  |             <div><textarea name="questions" required></textarea></div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div id="footer"> | ||||||
|  |         <div id="questions"> | ||||||
|  |             {{ i18n.questions_prefix }} {{ num_lines }} {{ i18n.questions_suffix }} | ||||||
|  |             <br> | ||||||
|  |             <a href="/">Home</a> | ||||||
|  |         </div> | ||||||
|  |         {% include 'toggle.html' %} | ||||||
|  |         <button id="next" type="submit">{{ i18n.submit }}</button> | ||||||
|  |     </div> | ||||||
|  | </form> | ||||||
|  | {% endblock %} | ||||||
							
								
								
									
										16
									
								
								templates/thanks.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								templates/thanks.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | {% extends 'base.html' %} | ||||||
|  | 
 | ||||||
|  | {% block main %} | ||||||
|  |         <div class="ab"> | ||||||
|  |             <div class="a"> | ||||||
|  |                 <h1>{{ i18n.submit_thanks_title }}</h1> | ||||||
|  |                 {{ i18n.submit_thanks | safe }} | ||||||
|  |                 <p>[<a href="/">Home</a>]</p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |         <div id="footer"> | ||||||
|  |             <div class="box"> </div> | ||||||
|  | {% include 'toggle.html' %}             | ||||||
|  |             <div class="box"> </div>         | ||||||
|  |         </div> | ||||||
|  | {% endblock %} | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue