106 lines
4.0 KiB
Python
106 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
import datetime
|
|
import json
|
|
import logging
|
|
import os
|
|
from django.apps import apps
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib.auth.models import Group
|
|
|
|
from ..models.event import Event
|
|
from ..models.eventstatus import EventStatus
|
|
|
|
|
|
class RoleMixin:
|
|
def create_user_for_role(self, role_name, first_name, last_name, password='password'):
|
|
app_config = apps.get_app_config('dav_events')
|
|
var_name = 'groups_{}'.format(role_name)
|
|
if hasattr(app_config.settings, var_name):
|
|
# There are groups configured for this role.
|
|
# Use the first group name of the configured groups.
|
|
group_name = getattr(app_config.settings, var_name)[0]
|
|
else:
|
|
# There are no groups configured for this role.
|
|
# Configure one.
|
|
group_name = role_name
|
|
setting_name = 'groups_{}'.format(role_name)
|
|
setattr(app_config.settings, setting_name, [group_name])
|
|
|
|
# Make sure the configured group exists.
|
|
group = Group.objects.get_or_create(name=group_name)[0]
|
|
|
|
user_model = get_user_model()
|
|
number = user_model.objects.all().count() + 1
|
|
user_name = 'user{}-{}@localhost'.format(number, role_name)
|
|
user = user_model.objects.create_user(username=user_name, password=password, email=user_name,
|
|
first_name=first_name, last_name=last_name)
|
|
user.groups.add(group)
|
|
|
|
return user
|
|
|
|
|
|
class EventMixin:
|
|
def get_status_label(self, status_code):
|
|
return EventStatus.objects.get(code=status_code).label
|
|
|
|
def gen_event_data(self, exclude_fields=None):
|
|
if exclude_fields is None:
|
|
exclude_fields = []
|
|
|
|
data_dirname = 'data'
|
|
data_filename = 'events.json'
|
|
path = os.path.join(os.path.dirname(__file__), data_dirname, data_filename)
|
|
with open(path) as f:
|
|
data_sets = json.load(f)
|
|
for obj_data in data_sets:
|
|
data = {}
|
|
fields_data = obj_data['fields']
|
|
for key in fields_data:
|
|
if key in exclude_fields:
|
|
continue
|
|
value = fields_data[key]
|
|
if value in (None, ''):
|
|
continue
|
|
elif key == 'ski_lift' and value is False:
|
|
continue
|
|
elif key == 'arrivial_previous_day' and value is False:
|
|
continue
|
|
if key == 'created_at':
|
|
value = datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
|
elif key in ('pre_meeting_1', 'pre_meeting_2'):
|
|
value = datetime.datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
|
elif key in ('first_day', 'last_day', 'alt_first_day', 'alt_last_day', 'deadline'):
|
|
value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
|
|
elif key in ('meeting_time', 'departure_time', 'return_departure_time', 'return_arrival_time'):
|
|
value = datetime.datetime.strptime(value, '%H:%M:%S').time()
|
|
elif key == 'trainer_email':
|
|
value += '.example.com'
|
|
data[key] = value
|
|
yield data
|
|
|
|
def create_event_by_model(self, data=None):
|
|
if data is None:
|
|
exclude_fields = ('owner', 'created_at', 'number', 'planned_publication_date')
|
|
data = next(self.gen_event_data(exclude_fields=exclude_fields))
|
|
|
|
event = Event(**data)
|
|
event.save()
|
|
return event
|
|
|
|
def submit_event(self, event):
|
|
event.workflow.update_status('submitted', event.owner)
|
|
return event
|
|
|
|
def accept_event(self, event, user=None):
|
|
if user is None:
|
|
user = event.owner
|
|
event.workflow.update_status('accepted', user)
|
|
return event
|
|
|
|
def confirm_publication_event(self, event, user=None):
|
|
if user is None:
|
|
user = event.owner
|
|
event.workflow.update_status('published', user)
|
|
return event
|