# -*- 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