diff --git a/app/forms.py b/app/forms.py index f487645..8e3493e 100644 --- a/app/forms.py +++ b/app/forms.py @@ -116,3 +116,24 @@ class DeleteForm(FlaskForm): class LoginForm(FlaskForm): openid = StringField('openid', validators=[DataRequired()]) remember_me = BooleanField('remember_me', default=False) + +class AdminBeerEditForm(ModelForm, FlaskForm): + class Meta: + model = Beer + + name = StringField('För- och efternamn', validators=[DataRequired()]) + nickname = StringField('Kårnamn') + email = StringField('epost@din.com', validators=[Email()]) + person_number = StringField( + 'Personnummer', + validators=[ + DataRequired(), + Regexp( + "^[12]{1}[90]{1}[0-9]{6}-[0-9]{4}$", + message="Skriv personnummer på formatet ååååmmdd-xxxx" + ), + validate_age + ] + ) + mobile_number = StringField('Mobilnummer', validators=[DataRequired()]) + has_payed = BooleanField('Betalat') diff --git a/app/mail_ohlreise.py b/app/mail_ohlreise.py index 2a96ce4..7cff4cc 100644 --- a/app/mail_ohlreise.py +++ b/app/mail_ohlreise.py @@ -1,10 +1,16 @@ # -*- coding: utf-8 -*- -from app import app -import smtplib +import os +import json +import base64 from email.mime.text import MIMEText +from app import app +from google.auth.transport.requests import Request +from google.oauth2.credentials import Credentials +from googleapiclient.discovery import build + +SCOPES = ['https://www.googleapis.com/auth/gmail.send'] -FROM_ADDRESS = 'info.brutalakademien' SUBJECT = "Bokningskonfirmation" BODY = """ Tack för din anmälan! @@ -20,28 +26,79 @@ """ -def send(to_address="andreas.cederstrom@gmail.com", price=1337, - team_name="Aporna"): +def send(to_address="andreas.cederstrom@gmail.com", price=1337, team_name="Aporna"): bank = app.config['ÖHLREISE']['payment']['bank'] account_number = app.config['ÖHLREISE']['payment']['account_number'] last_payment_date = app.config['ÖHLREISE']['payment']['last_payment_date'] - mail = _build_mail(to_address, price, bank, account_number, last_payment_date, team_name) - _do_send(mail) + subject, body = _build_mail_content( + price, + bank, + account_number, + last_payment_date, + team_name + ) + return _do_send(to_address, subject, body) -def _build_mail(to_address, price, bank, account_number, last_payment_date , team_name): + +def _build_mail_content(price, bank, account_number, last_payment_date, team_name): body = BODY % (price, bank, account_number, last_payment_date, team_name) - mail = MIMEText(body) - mail['Subject'] = SUBJECT - mail['From'] = FROM_ADDRESS - mail['To'] = to_address - return mail - - -def _do_send(mail): - server = smtplib.SMTP('smtp.gmail.com', 587) - server.ehlo() - server.starttls() - server.login(app.config['GMAIL_USERNAME'], app.config['GMAIL_PASSWORD']) - server.sendmail(mail['From'], mail['To'], mail.as_string()) - server.quit() + return SUBJECT, body + + +def _load_credentials(): + token_path = app.config['GOOGLE_OAUTH_TOKEN_FILE'] + + if not os.path.exists(token_path): + raise RuntimeError( + "Gmail OAuth token.json is missing. Connect Gmail via the admin OAuth route first." + ) + + with open(token_path, 'r') as f: + token_data = json.load(f) + + creds = Credentials.from_authorized_user_info(token_data, SCOPES) + + if creds.expired and creds.refresh_token: + creds.refresh(Request()) + _save_credentials(creds) + + if not creds.valid: + raise RuntimeError("Gmail OAuth credentials are invalid. Reconnect Gmail.") + + return creds + + +def _save_credentials(creds): + token_path = app.config['GOOGLE_OAUTH_TOKEN_FILE'] + with open(token_path, 'w') as f: + f.write(creds.to_json()) + + +def _build_gmail_service(): + creds = _load_credentials() + return build('gmail', 'v1', credentials=creds) + + +def _create_message(to_address, subject, body): + from_address = app.config['GMAIL_FROM_ADDRESS'] + + message = MIMEText(body, _charset='utf-8') + message['To'] = to_address + message['From'] = from_address + message['Reply-To'] = from_address + message['Subject'] = subject + + raw = base64.urlsafe_b64encode(message.as_bytes()).decode('utf-8') + return {'raw': raw} + + +def _do_send(to_address, subject, body): + service = _build_gmail_service() + message = _create_message(to_address, subject, body) + + service.users().messages().send( + userId='me', + body=message + ).execute() + \ No newline at end of file diff --git a/app/templates/ohlreise/countdown.html b/app/templates/ohlreise/countdown.html index 052521f..fad0900 100644 --- a/app/templates/ohlreise/countdown.html +++ b/app/templates/ohlreise/countdown.html @@ -2,7 +2,7 @@ {% block title %}Anmälan{% endblock %} {% block content %} @@ -18,7 +32,36 @@

Alla anmälda bussresenärer

Totalt har vi {{ beer|length }} anmälda bussresenärer.

+ + {% if is_admin %} +

+ Antal som har betalat: {{ beer|selectattr("has_payed")|list|length }}
+ Antal som inte har betalat: {{ beer|rejectattr("has_payed")|list|length }} +

+ +
+ +
+ +