create cafe view
This commit is contained in:
parent
ba01ccd3e5
commit
be39be53f0
5 changed files with 94 additions and 2 deletions
|
|
@ -18,7 +18,8 @@
|
||||||
"Keycloak",
|
"Keycloak",
|
||||||
"tabindex",
|
"tabindex",
|
||||||
"onetimelogin",
|
"onetimelogin",
|
||||||
"Ammeldelink"
|
"Ammeldelink",
|
||||||
|
"orga"
|
||||||
],
|
],
|
||||||
"ignoreWords": [],
|
"ignoreWords": [],
|
||||||
"import": []
|
"import": []
|
||||||
|
|
|
||||||
|
|
@ -113,3 +113,22 @@ class RegisterGuest(forms.Form):
|
||||||
max_length=200
|
max_length=200
|
||||||
)
|
)
|
||||||
accept_agb = HoneypotField(label="")
|
accept_agb = HoneypotField(label="")
|
||||||
|
|
||||||
|
|
||||||
|
class CreateCafe(forms.Form):
|
||||||
|
"""
|
||||||
|
Form for creating new Repair-Cafés.
|
||||||
|
"""
|
||||||
|
location = forms.CharField(
|
||||||
|
label="Ort",
|
||||||
|
max_length=200,
|
||||||
|
help_text="Name des Orts, z.B. AWO."
|
||||||
|
)
|
||||||
|
address = forms.CharField(
|
||||||
|
label="Adresse",
|
||||||
|
max_length=200,
|
||||||
|
help_text="Straße, Hausnummer und Ortsname."
|
||||||
|
)
|
||||||
|
event_date = forms.DateField(
|
||||||
|
label="Veranstaltungsdatum"
|
||||||
|
)
|
||||||
|
|
|
||||||
15
rc_hip/repapp/templates/repapp/orga/create_cafe.html
Normal file
15
rc_hip/repapp/templates/repapp/orga/create_cafe.html
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends "repapp/base.html" %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}
|
||||||
|
- Repair-Café anlegen
|
||||||
|
{% endblock title %}
|
||||||
|
{% block page_title %}
|
||||||
|
Repair-Café anlegen
|
||||||
|
{% endblock page_title %}
|
||||||
|
{% block content %}
|
||||||
|
<form action="{% url 'create_cafe' %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form|crispy }}
|
||||||
|
<button type="submit" class="btn btn-primary submit_button">Absenden</button>
|
||||||
|
</form>
|
||||||
|
{% endblock content %}
|
||||||
|
|
@ -26,6 +26,7 @@ urlpatterns = [
|
||||||
views.one_time_login, name="one_time_login"),
|
views.one_time_login, name="one_time_login"),
|
||||||
path("member/login/",
|
path("member/login/",
|
||||||
views.member_login, name="member_login"),
|
views.member_login, name="member_login"),
|
||||||
|
path("orga/cafe/create", views.CreateCafeView.as_view(), name="create_cafe"),
|
||||||
path("cron", views.cron, name="cron"),
|
path("cron", views.cron, name="cron"),
|
||||||
path("bootstrap", views.bootstrap, name="bootstrap"),
|
path("bootstrap", views.bootstrap, name="bootstrap"),
|
||||||
path("process_mails", views.process_mails, name="process_mails"),
|
path("process_mails", views.process_mails, name="process_mails"),
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import random
|
||||||
import string
|
import string
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
@ -17,14 +18,18 @@ from django.shortcuts import get_object_or_404, render
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
from django.http import HttpResponseRedirect, HttpResponse
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib.auth import authenticate, login
|
from django.contrib.auth import authenticate, login
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
from .forms import RegisterDevice, RegisterGuest
|
from .forms import RegisterDevice, RegisterGuest, CreateCafe
|
||||||
from .models import (Cafe, Device, Guest, OneTimeLogin,
|
from .models import (Cafe, Device, Guest, OneTimeLogin,
|
||||||
CustomUser, Organisator, Reparateur)
|
CustomUser, Organisator, Reparateur)
|
||||||
from . import mail_interface
|
from . import mail_interface
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def send_one_time_login_mail(secret, mail, request):
|
def send_one_time_login_mail(secret, mail, request):
|
||||||
"""
|
"""
|
||||||
Send a mail with a one time login link.
|
Send a mail with a one time login link.
|
||||||
|
|
@ -156,6 +161,14 @@ def is_member(user):
|
||||||
return organisator or reparateur
|
return organisator or reparateur
|
||||||
|
|
||||||
|
|
||||||
|
def is_organisator(user):
|
||||||
|
"""
|
||||||
|
Test is a user is a Repair-Café organisator.
|
||||||
|
"""
|
||||||
|
organisator = Organisator.objects.filter(mail=user.email).first()
|
||||||
|
return organisator is not None
|
||||||
|
|
||||||
|
|
||||||
def create_one_time_login(user, url) -> str:
|
def create_one_time_login(user, url) -> str:
|
||||||
"""
|
"""
|
||||||
create_one_time_login creates a one time login object for guest user logins.
|
create_one_time_login creates a one time login object for guest user logins.
|
||||||
|
|
@ -401,6 +414,7 @@ def member_login(request):
|
||||||
"""
|
"""
|
||||||
Login page for repair cafe members, using OIDC.
|
Login page for repair cafe members, using OIDC.
|
||||||
"""
|
"""
|
||||||
|
# TODO: create member login landing page
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"repapp/member_login.html"
|
"repapp/member_login.html"
|
||||||
|
|
@ -462,3 +476,45 @@ def bootstrap(request):
|
||||||
request,
|
request,
|
||||||
"repapp/bootstrap.html"
|
"repapp/bootstrap.html"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class CreateCafeView(LoginRequiredMixin, generic.edit.FormView):
|
||||||
|
"""
|
||||||
|
Organisator view for registering a new guest.
|
||||||
|
"""
|
||||||
|
# TODO: create test
|
||||||
|
login_url = reverse_lazy('member_login')
|
||||||
|
template_name = "repapp/orga/create_cafe.html"
|
||||||
|
form_class = CreateCafe
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
if not is_organisator(self.request.user):
|
||||||
|
raise PermissionDenied('Only accessible for organisator.')
|
||||||
|
|
||||||
|
location = form.cleaned_data['location']
|
||||||
|
address = form.cleaned_data['address']
|
||||||
|
event_date = form.cleaned_data['event_date']
|
||||||
|
|
||||||
|
cafe = Cafe(
|
||||||
|
location=location,
|
||||||
|
address=address,
|
||||||
|
event_date=event_date,
|
||||||
|
)
|
||||||
|
cafe.save()
|
||||||
|
|
||||||
|
messages.add_message(self.request, messages.INFO,
|
||||||
|
'Es wurde ein neues Repair-Café '
|
||||||
|
f'am {cafe.event_date} angelegt')
|
||||||
|
|
||||||
|
# TODO: redirect to orga main view
|
||||||
|
return HttpResponseRedirect(
|
||||||
|
reverse_lazy('index')
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
if not is_organisator(self.request.user):
|
||||||
|
logger.warning('Access violation: %s is no organisator!' %
|
||||||
|
self.request.user)
|
||||||
|
raise PermissionDenied('Only accessible for organisator.')
|
||||||
|
|
||||||
|
return super(CreateCafeView, self).get_context_data(**kwargs)
|
||||||
|
|
|
||||||
Reference in a new issue