2011-07-31 10:46:29 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
openslides . participant . models
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Models for the participant app .
2012-04-25 22:29:19 +02:00
: copyright : 2011 , 2012 by OpenSlides team , see AUTHORS .
2011-07-31 10:46:29 +02:00
: license : GNU GPL , see LICENSE for more details .
"""
2012-08-12 12:52:38 +02:00
from django . contrib . auth . models import User as DjangoUser , Group as DjangoGroup
2011-07-31 10:46:29 +02:00
from django . db import models
2012-08-11 10:51:52 +02:00
from django . db . models import signals
2012-07-07 15:26:00 +02:00
from django . dispatch import receiver
2012-07-10 01:33:03 +02:00
from django . utils . translation import ugettext_lazy as _ , ugettext_noop
2012-07-07 15:26:00 +02:00
2012-10-24 12:15:29 +02:00
from openslides . utils . person import PersonMixin , Person
2012-08-13 14:37:49 +02:00
from openslides . utils . person . signals import receive_persons
2012-08-03 00:11:53 +02:00
2012-09-14 02:46:43 +02:00
from openslides . config . models import config
2012-07-07 15:26:00 +02:00
from openslides . config . signals import default_config_value
2012-11-06 00:02:44 +01:00
from openslides . projector . api import register_slidemodel
from openslides . projector . projector import SlideMixin
2011-07-31 10:46:29 +02:00
2012-11-24 14:01:21 +01:00
2012-11-06 00:02:44 +01:00
class User ( DjangoUser , PersonMixin , Person , SlideMixin ) :
2012-11-24 14:01:21 +01:00
prefix = ' user ' # This is for the slides
2012-08-12 12:52:38 +02:00
person_prefix = ' user '
2011-07-31 10:46:29 +02:00
GENDER_CHOICES = (
( ' male ' , _ ( ' Male ' ) ) ,
( ' female ' , _ ( ' Female ' ) ) ,
)
2012-09-14 01:52:20 +02:00
TYPE_CHOICES = (
2011-07-31 10:46:29 +02:00
( ' delegate ' , _ ( ' Delegate ' ) ) ,
( ' observer ' , _ ( ' Observer ' ) ) ,
( ' staff ' , _ ( ' Staff ' ) ) ,
2011-09-07 22:46:47 +02:00
( ' guest ' , _ ( ' Guest ' ) ) ,
2011-07-31 10:46:29 +02:00
)
2012-08-12 12:52:38 +02:00
django_user = models . OneToOneField ( DjangoUser , editable = False , parent_link = True )
2012-11-19 23:30:09 +01:00
structure_level = models . CharField (
max_length = 100 , blank = True , default = ' ' , verbose_name = _ ( " Structure level " ) ,
2012-10-30 22:16:43 +01:00
help_text = _ ( ' Will be shown after the name. ' ) )
2012-08-08 10:34:23 +02:00
gender = models . CharField (
max_length = 50 , choices = GENDER_CHOICES , blank = True ,
2012-10-30 22:16:43 +01:00
verbose_name = _ ( " Gender " ) , help_text = _ ( ' Only for filtering the participant list. ' ) )
2012-08-08 10:34:23 +02:00
type = models . CharField (
2012-09-14 01:52:20 +02:00
max_length = 100 , choices = TYPE_CHOICES , blank = True ,
2012-10-30 22:16:43 +01:00
verbose_name = _ ( " Typ " ) , help_text = _ ( ' Only for filtering the participant list. ' ) )
2012-08-08 10:34:23 +02:00
committee = models . CharField (
2012-10-24 12:30:45 +02:00
max_length = 100 , blank = True , default = ' ' , verbose_name = _ ( " Committee " ) ,
2012-10-30 22:16:43 +01:00
help_text = _ ( ' Only for filtering the participant list. ' ) )
2012-11-03 09:34:42 +01:00
about_me = models . TextField (
blank = True , default = ' ' , verbose_name = _ ( ' About me ' ) ,
help_text = _ ( ' Your profile text ' ) )
2012-08-08 10:34:23 +02:00
comment = models . TextField (
2012-10-24 12:30:45 +02:00
blank = True , default = ' ' , verbose_name = _ ( ' Comment ' ) ,
2012-08-08 10:34:23 +02:00
help_text = _ ( ' Only for notes. ' ) )
2012-08-13 14:37:49 +02:00
default_password = models . CharField (
2012-10-24 12:30:45 +02:00
max_length = 100 , blank = True , default = ' ' ,
2012-08-13 14:37:49 +02:00
verbose_name = _ ( " Default password " ) )
2011-09-03 17:17:29 +02:00
2012-10-24 12:15:29 +02:00
@property
def clean_name ( self ) :
return self . get_full_name ( ) or self . username
2012-08-13 14:37:49 +02:00
def get_name_suffix ( self ) :
2012-11-19 23:30:09 +01:00
return self . structure_level
2012-08-10 11:14:11 +02:00
2012-08-13 14:37:49 +02:00
def set_name_suffix ( self , value ) :
2012-11-19 23:30:09 +01:00
self . structure_level = value
2012-08-10 11:14:11 +02:00
2012-08-13 14:37:49 +02:00
name_suffix = property ( get_name_suffix , set_name_suffix )
2012-08-10 11:14:11 +02:00
2012-08-08 10:07:36 +02:00
def reset_password ( self , password = None ) :
2012-07-07 15:26:00 +02:00
"""
Reset the password for the user to his default - password .
"""
2012-08-08 10:07:36 +02:00
if password is None :
2012-08-13 14:37:49 +02:00
password = self . default_password
2012-08-12 12:52:38 +02:00
self . set_password ( password )
self . save ( )
2011-07-31 10:46:29 +02:00
2012-11-22 16:19:09 +01:00
@property
def sort_name ( self ) :
if config [ ' participant_sort_users_by_first_name ' ] :
2012-11-22 16:54:56 +01:00
return self . first_name . lower ( )
return self . last_name . lower ( )
2012-11-22 16:19:09 +01:00
2012-04-13 11:35:53 +02:00
@models.permalink
2012-10-30 00:07:25 +01:00
def get_absolute_url ( self , link = ' view ' ) :
2012-04-13 11:35:53 +02:00
"""
Return the URL to this user .
link can be :
2012-10-30 00:07:25 +01:00
* view
2012-04-13 11:35:53 +02:00
* edit
* delete
"""
2012-10-30 00:07:25 +01:00
if link == ' view ' :
return ( ' user_view ' , [ str ( self . id ) ] )
2012-04-13 11:35:53 +02:00
if link == ' edit ' :
2012-08-11 10:09:54 +02:00
return ( ' user_edit ' , [ str ( self . id ) ] )
2012-04-13 11:35:53 +02:00
if link == ' delete ' :
2012-08-11 10:09:54 +02:00
return ( ' user_delete ' , [ str ( self . id ) ] )
2012-04-13 11:35:53 +02:00
2011-07-31 10:46:29 +02:00
def __unicode__ ( self ) :
2012-08-13 14:37:49 +02:00
if self . name_suffix :
2012-10-24 12:15:29 +02:00
return u " %s ( %s ) " % ( self . clean_name , self . name_suffix )
return u " %s " % self . clean_name
2011-07-31 10:46:29 +02:00
class Meta :
2012-08-07 22:43:57 +02:00
# Rename permissions
2011-07-31 10:46:29 +02:00
permissions = (
2012-07-07 15:26:00 +02:00
( ' can_see_participant ' , ugettext_noop ( " Can see participant " ) ) ,
2012-08-08 10:34:23 +02:00
( ' can_manage_participant ' ,
ugettext_noop ( " Can manage participant " ) ) ,
2011-07-31 10:46:29 +02:00
)
2012-09-14 03:02:00 +02:00
ordering = ( ' last_name ' , )
2012-04-15 12:39:28 +02:00
2012-11-06 00:02:44 +01:00
def slide ( self ) :
"""
Returns a map with the data for the slides .
"""
return {
' shown_user ' : self ,
' title ' : self . clean_name ,
' template ' : ' projector/UserSlide.html ' }
register_slidemodel ( User )
2012-04-15 12:39:28 +02:00
2012-11-24 14:01:21 +01:00
2012-11-21 14:22:30 +01:00
class Group ( DjangoGroup , PersonMixin , Person , SlideMixin ) :
2012-11-24 14:01:21 +01:00
prefix = ' group ' # This is for the slides
2012-08-12 12:52:38 +02:00
person_prefix = ' group '
2012-08-03 00:11:53 +02:00
2012-08-12 12:52:38 +02:00
django_group = models . OneToOneField ( DjangoGroup , editable = False , parent_link = True )
2012-11-07 22:16:11 +01:00
group_as_person = models . BooleanField ( default = False , verbose_name = _ ( " Use this group as participant " ) , help_text = _ ( ' For example as submitter of a motion. ' ) )
2012-10-30 22:16:43 +01:00
description = models . TextField ( blank = True , verbose_name = _ ( " Description " ) )
2012-08-03 00:11:53 +02:00
2012-08-11 10:09:54 +02:00
@models.permalink
2012-10-30 00:07:25 +01:00
def get_absolute_url ( self , link = ' view ' ) :
2012-08-11 10:09:54 +02:00
"""
Return the URL to this user .
link can be :
2012-10-30 00:07:25 +01:00
* view
2012-08-11 10:09:54 +02:00
* edit
* delete
"""
2012-10-30 00:07:25 +01:00
if link == ' view ' :
return ( ' user_group_view ' , [ str ( self . id ) ] )
2012-08-11 10:09:54 +02:00
if link == ' edit ' :
return ( ' user_group_edit ' , [ str ( self . id ) ] )
if link == ' delete ' :
return ( ' user_group_delete ' , [ str ( self . id ) ] )
2012-08-03 00:11:53 +02:00
def __unicode__ ( self ) :
2012-08-12 12:52:38 +02:00
return unicode ( self . name )
2012-08-03 00:11:53 +02:00
2012-09-14 03:02:00 +02:00
class Meta :
ordering = ( ' name ' , )
2012-11-21 14:22:30 +01:00
def slide ( self ) :
"""
Returns a map with the data for the slides .
"""
return {
' group ' : self ,
' title ' : self . name ,
' template ' : ' projector/GroupSlide.html ' }
register_slidemodel ( Group )
2012-08-03 00:11:53 +02:00
2012-11-24 14:01:21 +01:00
2012-09-14 02:24:02 +02:00
class UsersAndGroupsToPersons ( object ) :
"""
Object to send all Users and Groups or a special User or Group to
the Person - API via receice_persons ( )
"""
2012-08-13 14:37:49 +02:00
def __init__ ( self , person_prefix_filter = None , id_filter = None ) :
self . person_prefix_filter = person_prefix_filter
self . id_filter = id_filter
2012-09-14 02:46:43 +02:00
if config [ ' participant_sort_users_by_first_name ' ] :
self . users = User . objects . all ( ) . order_by ( ' first_name ' )
else :
2012-10-30 23:00:24 +01:00
self . users = User . objects . all ( ) . order_by ( ' last_name ' )
2012-08-13 14:37:49 +02:00
self . groups = Group . objects . filter ( group_as_person = True )
2012-08-03 00:11:53 +02:00
def __iter__ ( self ) :
2012-08-13 14:37:49 +02:00
if ( not self . person_prefix_filter or
self . person_prefix_filter == User . person_prefix ) :
if self . id_filter :
2012-09-15 09:11:56 +02:00
try :
yield self . users . get ( pk = self . id_filter )
except User . DoesNotExist :
pass
2012-08-03 14:23:13 +02:00
else :
2012-08-13 14:37:49 +02:00
for user in self . users :
2012-08-07 22:43:57 +02:00
yield user
2012-08-03 14:23:13 +02:00
2012-08-13 14:37:49 +02:00
if ( not self . person_prefix_filter or
self . person_prefix_filter == Group . person_prefix ) :
if self . id_filter :
2012-09-15 09:11:56 +02:00
try :
yield self . groups . get ( pk = self . id_filter )
except Group . DoesNotExist :
pass
2012-08-03 14:23:13 +02:00
else :
2012-08-13 14:37:49 +02:00
for group in self . groups :
2012-08-03 14:23:13 +02:00
yield group
2012-08-03 00:11:53 +02:00
2012-08-13 14:37:49 +02:00
@receiver ( receive_persons , dispatch_uid = " participant " )
def receive_persons ( sender , * * kwargs ) :
2012-09-14 02:24:02 +02:00
"""
Answers to the Person - API
"""
2012-11-24 14:01:21 +01:00
return UsersAndGroupsToPersons (
person_prefix_filter = kwargs [ ' person_prefix_filter ' ] ,
id_filter = kwargs [ ' id_filter ' ] )
2012-08-03 00:11:53 +02:00
2012-04-15 12:39:28 +02:00
@receiver ( default_config_value , dispatch_uid = " participant_default_config " )
def default_config ( sender , key , * * kwargs ) :
2012-07-07 15:26:00 +02:00
"""
Default values for the participant app .
"""
2012-08-07 22:43:57 +02:00
# TODO: Rename config-vars
2012-04-15 12:39:28 +02:00
return {
' participant_pdf_system_url ' : ' http://example.com:8000 ' ,
2012-04-22 16:51:22 +02:00
' participant_pdf_welcometext ' : _ ( ' Welcome to OpenSlides! ' ) ,
2012-09-14 02:40:40 +02:00
' participant_sort_users_by_first_name ' : False ,
2012-04-15 12:39:28 +02:00
} . get ( key )
2012-08-07 22:43:57 +02:00
2012-08-12 12:52:38 +02:00
@receiver ( signals . post_save , sender = DjangoUser )
2012-11-22 18:39:54 +01:00
def djangouser_post_save ( sender , instance , signal , * args , * * kwargs ) :
2012-08-10 13:11:10 +02:00
try :
2012-08-12 12:52:38 +02:00
instance . user
except User . DoesNotExist :
User ( django_user = instance ) . save_base ( raw = True )
2012-08-10 11:51:45 +02:00
2012-08-12 12:52:38 +02:00
@receiver ( signals . post_save , sender = DjangoGroup )
2012-11-22 18:39:54 +01:00
def djangogroup_post_save ( sender , instance , signal , * args , * * kwargs ) :
2012-08-11 10:09:54 +02:00
try :
2012-08-12 12:52:38 +02:00
instance . group
except Group . DoesNotExist :
Group ( django_group = instance ) . save_base ( raw = True )
2012-11-22 18:39:54 +01:00
@receiver ( signals . post_save , sender = User )
def user_post_save ( sender , instance , * args , * * kwargs ) :
2012-11-23 09:35:41 +01:00
from openslides . participant . api import get_or_create_registered_group
2012-11-22 18:39:54 +01:00
if not kwargs [ ' created ' ] :
return
2012-11-23 09:35:41 +01:00
registered = get_or_create_registered_group ( )
2012-11-22 18:39:54 +01:00
instance . groups . add ( registered )
instance . save ( )