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()) |