app/soc/views/models/user.py
changeset 1014 508ad99368e2
parent 934 9fcc08971efe
child 1030 a0081c626acb
equal deleted inserted replaced
1013:68c52d6b3fb4 1014:508ad99368e2
    25 
    25 
    26 from google.appengine.api import users
    26 from google.appengine.api import users
    27 
    27 
    28 from django import forms
    28 from django import forms
    29 
    29 
       
    30 from soc.logic import cleaning
    30 from soc.logic import dicts
    31 from soc.logic import dicts
    31 from soc.logic import validate
       
    32 from soc.logic.models.site import logic as site_logic
    32 from soc.logic.models.site import logic as site_logic
    33 from soc.logic.models.user import logic as user_logic
    33 from soc.logic.models.user import logic as user_logic
    34 from soc.views import helper
    34 from soc.views import helper
       
    35 from soc.views.helper import access
    35 from soc.views.helper import redirects
    36 from soc.views.helper import redirects
       
    37 from soc.views.helper import widgets
    36 from soc.views.models import base
    38 from soc.views.models import base
    37 
    39 
    38 import soc.models.linkable
    40 import soc.models.linkable
    39 import soc.models.user
       
    40 import soc.logic.models.user
    41 import soc.logic.models.user
    41 import soc.views.helper
    42 import soc.views.helper
    42 
       
    43 
       
    44 class CreateForm(helper.forms.BaseForm):
       
    45   """Django form displayed when creating a User.
       
    46   """
       
    47 
       
    48   email = forms.EmailField(
       
    49       label=soc.models.user.User.account.verbose_name,
       
    50       help_text=soc.models.user.User.account.help_text)
       
    51 
       
    52   link_id = forms.CharField(
       
    53       label=soc.models.user.User.link_id.verbose_name,
       
    54       help_text=soc.models.linkable.Linkable.link_id.help_text)
       
    55 
       
    56   name = forms.CharField(
       
    57       label=soc.models.user.User.name.verbose_name,
       
    58       help_text=soc.models.user.User.name.help_text)
       
    59 
       
    60   is_developer = forms.BooleanField(required=False,
       
    61       label=soc.models.user.User.is_developer.verbose_name,
       
    62       help_text=soc.models.user.User.is_developer.help_text)
       
    63 
       
    64   agrees_to_tos = forms.BooleanField(required=False,
       
    65       widget=helper.widgets.ReadOnlyBool(),
       
    66       label=soc.models.user.User.agrees_to_tos.verbose_name,
       
    67       help_text=soc.models.user.User.agrees_to_tos.help_text)
       
    68 
       
    69   class Meta:
       
    70     """Inner Meta class that defines some behavior for the form.
       
    71     """
       
    72     model = None
       
    73 
       
    74   def clean_link_id(self):
       
    75     link_id = self.cleaned_data.get('link_id').lower()
       
    76     if not validate.isLinkIdFormatValid(link_id):
       
    77       raise forms.ValidationError("This link ID is in wrong format.")
       
    78 
       
    79     properties = {'link_id': link_id}
       
    80 
       
    81     link_id_user = soc.logic.models.user.logic.getForFields(properties,
       
    82                                                             unique=True)
       
    83     key_name = self.data.get('key_name')
       
    84     if key_name:
       
    85       key_name_user = user_logic.getFromKeyName(key_name)
       
    86       
       
    87       if (link_id_user and key_name_user
       
    88           and (link_id_user.account != key_name_user.account)):
       
    89         raise forms.ValidationError("This link ID is already in use.")
       
    90 
       
    91     return link_id
       
    92 
       
    93   def clean_email(self):
       
    94     form_account = users.User(email=self.cleaned_data.get('email'))
       
    95     key_name = self.data.get('key_name')
       
    96     if key_name:
       
    97       user = user_logic.getFromKeyName(key_name)
       
    98       old_email = user.account.email()
       
    99     else:
       
   100       old_email = None
       
   101 
       
   102     new_email = form_account.email()
       
   103 
       
   104     if new_email != old_email \
       
   105         and user_logic.getForFields({'email': new_email}, unique=True):
       
   106       raise forms.ValidationError("This account is already in use.")
       
   107 
       
   108     return self.cleaned_data.get('email')
       
   109 
       
   110 
       
   111 class EditForm(CreateForm):
       
   112   """Django form displayed when editing a User.
       
   113   """
       
   114 
       
   115   key_name = forms.CharField(widget=forms.HiddenInput)
       
   116 
    43 
   117 
    44 
   118 class View(base.View):
    45 class View(base.View):
   119   """View methods for the User model.
    46   """View methods for the User model.
   120   """
    47   """
   126 
    53 
   127     Params:
    54     Params:
   128       params: a dict with params for this View
    55       params: a dict with params for this View
   129     """
    56     """
   130 
    57 
       
    58     rights = access.Checker(params)
       
    59     rights['create'] = ['checkIsDeveloper']
       
    60     rights['edit'] = ['checkIsDeveloper']
       
    61     rights['delete'] = ['checkIsDeveloper']
       
    62     rights['list'] = ['checkIsDeveloper']
       
    63 
   131     new_params = {}
    64     new_params = {}
   132     new_params['logic'] = soc.logic.models.user.logic
    65     new_params['logic'] = soc.logic.models.user.logic
   133 
    66     new_params['rights'] = rights
       
    67     
   134     new_params['name'] = "User"
    68     new_params['name'] = "User"
   135 
    69 
   136     new_params['edit_form'] = EditForm
    70     new_params['edit_template'] = 'soc/user/edit.html'
   137     new_params['create_form'] = CreateForm
       
   138 
    71 
   139     new_params['edit_template'] = 'soc/user/edit.html'
       
   140     
       
   141     new_params['sidebar_heading'] = 'Users'
    72     new_params['sidebar_heading'] = 'Users'
   142 
    73 
       
    74     new_params['extra_dynaexclude'] = ['former_accounts']
       
    75     new_params['create_extra_dynafields'] = {
       
    76         'clean_link_id': cleaning.clean_user_not_exist('link_id'),
       
    77         'clean_account': cleaning.clean_user_account_not_in_use('account')}
       
    78 
       
    79 #TODO edit_extra_dynafields => link_id read only
       
    80     new_params['edit_extra_dynafields'] = {
       
    81         'link_id' : forms.CharField(widget=widgets.ReadOnlyInput(),
       
    82                                    required=True),
       
    83         'clean_link_id': cleaning.clean_link_id,
       
    84         'clean_account': cleaning.clean_user_account('account'),
       
    85         'clean' : cleaning.validate_user_edit('link_id', 'account'),
       
    86     }
   143     params = dicts.merge(params, new_params)
    87     params = dicts.merge(params, new_params)
   144 
    88 
   145     super(View, self).__init__(params=params)
    89     super(View, self).__init__(params=params)
   146 
    90 
   147 
    91 
   148   def _editGet(self, request, entity, form):
    92   def _editGet(self, request, entity, form):
   149     """See base.View._editGet().
    93     """See base.View._editGet().
   150     """
    94     """
   151 
    95 
   152     # fill in the email field with the data from the entity
    96     # fill in the email field with the data from the entity
   153     form.fields['email'].initial = entity.account.email()
    97     form.fields['account'].initial = entity.account.email()
   154     form.fields['agrees_to_tos'].example_text = self._getToSExampleText()
    98     form.fields['agrees_to_tos'].example_text = self._getToSExampleText()
   155 
    99 
   156     super(View, self)._editGet(request, entity, form)
   100     super(View, self)._editGet(request, entity, form)
   157 
       
   158   def _editPost(self, request, entity, fields):
       
   159     """See base.View._editPost().
       
   160     """
       
   161 
       
   162     # fill in the account field with the user created from email
       
   163     fields['account'] = users.User(fields['email'])
       
   164 
       
   165     super(View, self)._editPost(request, entity, fields)
       
   166 
   101 
   167   def _getToSExampleText(self):
   102   def _getToSExampleText(self):
   168     """Returns example_text linking to site-wide ToS, or a warning message.
   103     """Returns example_text linking to site-wide ToS, or a warning message.
   169     """
   104     """
   170     tos_link = redirects.getToSRedirect(site_logic.getSingleton())
   105     tos_link = redirects.getToSRedirect(site_logic.getSingleton())