You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
6.5 KiB
Python

import json
from django.conf import settings
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.views import LoginView as DjangoLoginView
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import EmailMessage
from django.db.models import Q
from django.forms import formset_factory
from django.http import HttpResponseRedirect
from django.shortcuts import resolve_url
from django.template.loader import render_to_string
from django.urls import reverse, reverse_lazy
from django.utils import timezone
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.translation import ugettext_lazy as _
from django.views.generic import UpdateView, ListView, DetailView, FormView
from memberzone.models import MemberTask, MemberTaskRegistration, MemberDownloadFile, Profile
class MemeberTaskQuerysetMixin(object):
def get_queryset(self):
return MemberTask.objects.filter(groups__in=self.request.user.groups.all()).distinct()
class OverviewView(MemeberTaskQuerysetMixin, ListView):
template_name = 'memberzone/overview.html'
open_tasks = None
paginate_by = 3
def get_title(self):
return _('Grüezi, {first_name} {last_name}').format(
first_name=self.request.user.first_name,
last_name=self.request.user.last_name,
)
def get_download_sections(self):
file_list = MemberDownloadFile.objects.filter(groups__in=self.request.user.groups.all())
sections = {}
for file in file_list:
if not sections.get(file.section_id, None):
sections[file.section_id] = {
'section': file.section,
'items': []
}
sections[file.section_id]['items'].append(file)
sections_list = [{'title': x['section'].title, 'items': x['items'], 'ordering': x['section'].ordering} for x in
sections.values()]
return sorted(sections_list, key=lambda x: x['ordering'])
def get_queryset(self):
queryset = super(OverviewView, self).get_queryset()
return queryset.exclude(pk__in=self.get_open_tasks().values_list('pk', flat=True))
def get_open_tasks(self):
yesterday = timezone.now() - timezone.timedelta(days=1)
all_user_registrations = MemberTaskRegistration.objects.filter(user=self.request.user, cdate__lte=yesterday)
queryset = MemeberTaskQuerysetMixin.get_queryset(self)
queryset.exclude(registrations__in=all_user_registrations).order_by('-registrations__cdate')
return queryset
def get_context_data(self, **kwargs):
context = super(OverviewView, self).get_context_data(**kwargs)
context.update({
'download_sections': self.get_download_sections(),
'open_tasks': None if self.request.GET.get(self.page_kwarg, None) else self.get_open_tasks(),
})
return context
class MemberTaskDetailView(MemeberTaskQuerysetMixin, DetailView):
template_name = 'memberzone/task.html'
model = MemberTask
def get_title(self):
return self.object.title
def get_description(self):
return self.object.sub_title
def get_formset(self):
try:
MemberTaskRegistration.objects.get(task=self.object, user=self.request.user)
except MemberTaskRegistration.DoesNotExist:
MemeberTaskFormset = formset_factory(
self.object.form_class,
extra=0,
min_num=1,
max_num=self.object.max_num,
can_delete=True
)
formset_kwargs = {}
if self.request.method == 'POST':
formset_kwargs.update({
'data': self.request.POST
})
return MemeberTaskFormset(**formset_kwargs)
else:
return None
def formset_valid(self, formset):
registration = MemberTaskRegistration.objects.create(
task=self.object,
user=self.request.user,
form_data=json.dumps(formset.cleaned_data)
)
if registration.task.fields.count() > 0:
self.send_confirmation_email(registration=registration)
return HttpResponseRedirect(reverse('memberzone:task_success', args=[self.object.slug]))
def formset_invalid(self, formset):
return self.render_to_response(context=self.get_context_data(formset=formset, object=self.object))
def get(self, request, *args, **kwargs):
self.object = self.get_object()
formset = self.get_formset()
return self.render_to_response(context=self.get_context_data(formset=formset, object=self.object))
def send_confirmation_email(self, registration):
subject = _('Anmeldebestätigung: {}').format(registration.task.title)
confirmation_data = []
for data_set in json.loads(registration.form_data):
confirmation_data_set = []
for field in registration.task.fields.all():
value = data_set.get(field.name.replace('-', '_'), '')
if isinstance(value, list):
value = ','.join(value)
confirmation_data_set.append((field.label, value,))
confirmation_data.append(confirmation_data_set)
message = render_to_string('memberzone/email/member_registration_confirmation_email.html', {
'data': confirmation_data,
'subject': subject,
})
msg = EmailMessage(subject, message, settings.DEFAULT_FROM_EMAIL, to=[registration.user.email])
msg.content_subtype = "html"
# msg.send()
def post(self, request, *args, **kwargs):
self.object = self.get_object()
formset = self.get_formset()
if formset.is_valid():
return self.formset_valid(formset)
else:
return self.formset_invalid(formset)
class MemberTaskDetailSuccessView(MemeberTaskQuerysetMixin, DetailView):
template_name = 'memberzone/task_success.html'
model = MemberTask
def get_title(self):
return self.object.success_title
class ProfileEditView(UpdateView):
model = Profile
fields = ['first_name', 'last_name', 'street', 'zip', 'place', 'email']
template_name = 'memberzone/profile_edit.html'
success_url = reverse_lazy('memberzone:profile_edit_done')
def get_object(self, queryset=None):
return self.request.user.profile