59 """ |
59 """ |
60 account = forms.EmailField(required=False, |
60 account = forms.EmailField(required=False, |
61 label=soc.models.user.User.account.verbose_name, |
61 label=soc.models.user.User.account.verbose_name, |
62 help_text=soc.models.user.User.account.help_text) |
62 help_text=soc.models.user.User.account.help_text) |
63 |
63 |
64 link_name = forms.CharField(required=False, |
64 link_id = forms.CharField(required=False, |
65 label=soc.models.user.User.link_name.verbose_name, |
65 label=soc.models.user.User.link_id.verbose_name, |
66 help_text=soc.models.user.User.link_name.help_text) |
66 help_text=soc.models.user.User.link_id.help_text) |
67 |
67 |
68 class Meta: |
68 class Meta: |
69 model = None |
69 model = None |
70 |
70 |
71 def clean_link_name(self): |
71 def clean_link_id(self): |
72 link_name = self.cleaned_data.get('link_name') |
72 link_id = self.cleaned_data.get('link_id') |
73 |
73 |
74 if not link_name: |
74 if not link_id: |
75 # link name not supplied (which is OK), so do not try to validate it |
75 # link ID not supplied (which is OK), so do not try to validate it |
76 return None |
76 return None |
77 |
77 |
78 if not validate.isLinkNameFormatValid(link_name): |
78 if not validate.isLinkIdFormatValid(link_id): |
79 raise forms.ValidationError('This link name is in wrong format.') |
79 raise forms.ValidationError('This link ID is in wrong format.') |
80 |
80 |
81 return link_name |
81 return link_id |
82 |
82 |
83 def clean_account(self): |
83 def clean_account(self): |
84 email = self.cleaned_data.get('account') |
84 email = self.cleaned_data.get('account') |
85 |
85 |
86 if not email: |
86 if not email: |
147 |
147 |
148 if nearest_user_range_start is not None: |
148 if nearest_user_range_start is not None: |
149 context['lookup_link'] = './list?offset=%s&limit=%s' % ( |
149 context['lookup_link'] = './list?offset=%s&limit=%s' % ( |
150 nearest_user_range_start, range_width) |
150 nearest_user_range_start, range_width) |
151 if not user: |
151 if not user: |
152 # user not found yet, so see if link name was provided |
152 # user not found yet, so see if link ID was provided |
153 link_name = form.cleaned_data.get('link_name') |
153 link_id = form.cleaned_data.get('link_id') |
154 |
154 |
155 if link_name: |
155 if link_id: |
156 # link name provided, so try to look up by link name |
156 # link ID provided, so try to look up by link ID |
157 user = models.user.logic.getForFields({'link_name': link_name}, |
157 user = models.user.logic.getForFields({'link_id': link_id}, |
158 unique=True) |
158 unique=True) |
159 if user: |
159 if user: |
160 lookup_message = ugettext_lazy('User found by link name.') |
160 lookup_message = ugettext_lazy('User found by link ID.') |
161 # clear previous error, since User was found |
161 # clear previous error, since User was found |
162 email_error = None |
162 email_error = None |
163 # clear previous lookup_link, since User was found, the lookup_link |
163 # clear previous lookup_link, since User was found, the lookup_link |
164 # is not needed to display. |
164 # is not needed to display. |
165 context['lookup_link'] = None |
165 context['lookup_link'] = None |
166 else: |
166 else: |
167 context['link_name_error'] = ugettext_lazy( |
167 context['link_id_error'] = ugettext_lazy( |
168 'User with that link name not found.') |
168 'User with that link ID not found.') |
169 if context['lookup_link'] is None: |
169 if context['lookup_link'] is None: |
170 range_width = helper.lists.getPreferredListPagination() |
170 range_width = helper.lists.getPreferredListPagination() |
171 nearest_user_range_start = ( |
171 nearest_user_range_start = ( |
172 models.user.logic.findNearestEntitiesOffset( |
172 models.user.logic.findNearestEntitiesOffset( |
173 width, [('link_name', link_name)])) |
173 width, [('link_id', link_id)])) |
174 |
174 |
175 if nearest_user_range_start is not None: |
175 if nearest_user_range_start is not None: |
176 context['lookup_link'] = './list?offset=%s&limit=%s' % ( |
176 context['lookup_link'] = './list?offset=%s&limit=%s' % ( |
177 nearest_user_range_start, range_width) |
177 nearest_user_range_start, range_width) |
178 # else: form was not valid |
178 # else: form was not valid |
180 |
180 |
181 if user: |
181 if user: |
182 # User entity found, so populate form with existing User information |
182 # User entity found, so populate form with existing User information |
183 # context['found_user'] = user |
183 # context['found_user'] = user |
184 form = LookupForm(initial={'account': user.account.email(), |
184 form = LookupForm(initial={'account': user.account.email(), |
185 'link_name': user.link_name}) |
185 'link_id': user.link_id}) |
186 |
186 |
187 if request.path.endswith('lookup'): |
187 if request.path.endswith('lookup'): |
188 # convert /lookup path into /profile/link_name path |
188 # convert /lookup path into /profile/link_id path |
189 context['edit_link'] = helper.requests.replaceSuffix( |
189 context['edit_link'] = helper.requests.replaceSuffix( |
190 request.path, 'lookup', 'profile/%s' % user.link_name) |
190 request.path, 'lookup', 'profile/%s' % user.link_id) |
191 # else: URL is not one that was expected, so do not display edit link |
191 # else: URL is not one that was expected, so do not display edit link |
192 elif not form: |
192 elif not form: |
193 # no pre-populated form was constructed, so show the empty look-up form |
193 # no pre-populated form was constructed, so show the empty look-up form |
194 form = LookupForm() |
194 form = LookupForm() |
195 |
195 |
211 """ |
211 """ |
212 account = forms.EmailField( |
212 account = forms.EmailField( |
213 label=soc.models.user.User.account.verbose_name, |
213 label=soc.models.user.User.account.verbose_name, |
214 help_text=soc.models.user.User.account.help_text) |
214 help_text=soc.models.user.User.account.help_text) |
215 |
215 |
216 link_name = forms.CharField( |
216 link_id = forms.CharField( |
217 label=soc.models.user.User.link_name.verbose_name, |
217 label=soc.models.user.User.link_id.verbose_name, |
218 help_text=soc.models.user.User.link_name.help_text) |
218 help_text=soc.models.user.User.link_id.help_text) |
219 |
219 |
220 nick_name = forms.CharField( |
220 nick_name = forms.CharField( |
221 label=soc.models.user.User.nick_name.verbose_name) |
221 label=soc.models.user.User.nick_name.verbose_name) |
222 |
222 |
223 is_developer = forms.BooleanField(required=False, |
223 is_developer = forms.BooleanField(required=False, |
227 key_name = forms.CharField(widget=forms.HiddenInput) |
227 key_name = forms.CharField(widget=forms.HiddenInput) |
228 |
228 |
229 class Meta: |
229 class Meta: |
230 model = None |
230 model = None |
231 |
231 |
232 def clean_link_name(self): |
232 def clean_link_id(self): |
233 link_name = self.cleaned_data.get('link_name') |
233 link_id = self.cleaned_data.get('link_id') |
234 if not validate.isLinkNameFormatValid(link_name): |
234 if not validate.isLinkIdFormatValid(link_id): |
235 raise forms.ValidationError("This link name is in wrong format.") |
235 raise forms.ValidationError("This link ID is in wrong format.") |
236 |
236 |
237 key_name = self.data.get('key_name') |
237 key_name = self.data.get('key_name') |
238 if key_name: |
238 if key_name: |
239 key_name_user = user_logic.logic.getFromKeyName(key_name) |
239 key_name_user = user_logic.logic.getFromKeyName(key_name) |
240 |
240 |
241 if link_name_user and key_name_user and \ |
241 if link_id_user and key_name_user and \ |
242 link_name_user.account != key_name_user.account: |
242 link_id_user.account != key_name_user.account: |
243 raise forms.ValidationError("This link name is already in use.") |
243 raise forms.ValidationError("This link ID is already in use.") |
244 |
244 |
245 return link_name |
245 return link_id |
246 |
246 |
247 def clean_account(self): |
247 def clean_account(self): |
248 form_account = users.User(email=self.cleaned_data.get('account')) |
248 form_account = users.User(email=self.cleaned_data.get('account')) |
249 if not accounts.isAccountAvailable( |
249 if not accounts.isAccountAvailable( |
250 form_account, existing_key_name=self.data.get('key_name')): |
250 form_account, existing_key_name=self.data.get('key_name')): |
259 DEF_CREATE_NEW_USER_MSG = ' You can create a new user by visiting' \ |
259 DEF_CREATE_NEW_USER_MSG = ' You can create a new user by visiting' \ |
260 ' <a href="/site/user/profile">Create ' \ |
260 ' <a href="/site/user/profile">Create ' \ |
261 'a New User</a> page.' |
261 'a New User</a> page.' |
262 |
262 |
263 @decorators.view |
263 @decorators.view |
264 def edit(request, page_name=None, link_name=None, |
264 def edit(request, page_name=None, link_id=None, |
265 template=DEF_SITE_USER_PROFILE_EDIT_TMPL): |
265 template=DEF_SITE_USER_PROFILE_EDIT_TMPL): |
266 """View for a Developer to modify the properties of a User Model entity. |
266 """View for a Developer to modify the properties of a User Model entity. |
267 |
267 |
268 Args: |
268 Args: |
269 request: the standard django request object |
269 request: the standard django request object |
270 page_name: the page name displayed in templates as page and header title |
270 page_name: the page name displayed in templates as page and header title |
271 link_name: the User's site-unique "link_name" extracted from the URL |
271 link_id: the User's site-unique "link_id" extracted from the URL |
272 template: the "sibling" template (or a search list of such templates) |
272 template: the "sibling" template (or a search list of such templates) |
273 from which to construct the public.html template name (or names) |
273 from which to construct the public.html template name (or names) |
274 |
274 |
275 Returns: |
275 Returns: |
276 A subclass of django.http.HttpResponse which either contains the form to |
276 A subclass of django.http.HttpResponse which either contains the form to |
286 context = helper.responses.getUniversalContext(request) |
286 context = helper.responses.getUniversalContext(request) |
287 context['page_name'] = page_name |
287 context['page_name'] = page_name |
288 |
288 |
289 user = None # assume that no User entity will be found |
289 user = None # assume that no User entity will be found |
290 |
290 |
291 # try to fetch User entity corresponding to link_name if one exists |
291 # try to fetch User entity corresponding to link_id if one exists |
292 try: |
292 try: |
293 if link_name: |
293 if link_id: |
294 user = accounts.getUserFromLinkNameOr404(link_name) |
294 user = accounts.getUserFromLinkIdOr404(link_id) |
295 except out_of_band.ErrorResponse, error: |
295 except out_of_band.ErrorResponse, error: |
296 # show custom 404 page when link name doesn't exist in Datastore |
296 # show custom 404 page when link ID doesn't exist in Datastore |
297 error.message = error.message + DEF_CREATE_NEW_USER_MSG |
297 error.message = error.message + DEF_CREATE_NEW_USER_MSG |
298 return simple.errorResponse(request, page_name, error, template, context) |
298 return simple.errorResponse(request, page_name, error, template, context) |
299 |
299 |
300 |
300 |
301 if request.method == 'POST': |
301 if request.method == 'POST': |
302 form = EditForm(request.POST) |
302 form = EditForm(request.POST) |
303 |
303 |
304 if form.is_valid(): |
304 if form.is_valid(): |
305 key_name = form.cleaned_data.get('key_name') |
305 key_name = form.cleaned_data.get('key_name') |
306 new_link_name = form.cleaned_data.get('link_name') |
306 new_link_id = form.cleaned_data.get('link_id') |
307 |
307 |
308 properties = {} |
308 properties = {} |
309 properties['account'] = form.cleaned_data.get('account') |
309 properties['account'] = form.cleaned_data.get('account') |
310 properties['link_name'] = new_link_name |
310 properties['link_id'] = new_link_id |
311 properties['nick_name'] = form.cleaned_data.get('nick_name') |
311 properties['nick_name'] = form.cleaned_data.get('nick_name') |
312 properties['is_developer'] = form.cleaned_data.get('is_developer') |
312 properties['is_developer'] = form.cleaned_data.get('is_developer') |
313 |
313 |
314 user = models.user.logic.updateOrCreateFromKeyName(properties, key_name) |
314 user = models.user.logic.updateOrCreateFromKeyName(properties, key_name) |
315 |
315 |
316 if not user: |
316 if not user: |
317 return http.HttpResponseRedirect('/') |
317 return http.HttpResponseRedirect('/') |
318 |
318 |
319 # redirect to new /site/user/profile/new_link_name?s=0 |
319 # redirect to new /site/user/profile/new_link_id?s=0 |
320 # (causes 'Profile saved' message to be displayed) |
320 # (causes 'Profile saved' message to be displayed) |
321 return helper.responses.redirectToChangedSuffix( |
321 return helper.responses.redirectToChangedSuffix( |
322 request, link_name, new_link_name, |
322 request, link_id, new_link_id, |
323 params=profile.SUBMIT_PROFILE_SAVED_PARAMS) |
323 params=profile.SUBMIT_PROFILE_SAVED_PARAMS) |
324 else: # method == 'GET': |
324 else: # method == 'GET': |
325 # try to fetch User entity corresponding to link name if one exists |
325 # try to fetch User entity corresponding to link ID if one exists |
326 if link_name: |
326 if link_id: |
327 if user: |
327 if user: |
328 # is 'Profile saved' parameter present, but referrer was not ourself? |
328 # is 'Profile saved' parameter present, but referrer was not ourself? |
329 # (e.g. someone bookmarked the GET that followed the POST submit) |
329 # (e.g. someone bookmarked the GET that followed the POST submit) |
330 if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME) |
330 if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME) |
331 and (not helper.requests.isReferrerSelf(request, |
331 and (not helper.requests.isReferrerSelf(request, |
332 suffix=link_name))): |
332 suffix=link_id))): |
333 # redirect to aggressively remove 'Profile saved' query parameter |
333 # redirect to aggressively remove 'Profile saved' query parameter |
334 return http.HttpResponseRedirect(request.path) |
334 return http.HttpResponseRedirect(request.path) |
335 |
335 |
336 # referrer was us, so select which submit message to display |
336 # referrer was us, so select which submit message to display |
337 # (may display no message if ?s=0 parameter is not present) |
337 # (may display no message if ?s=0 parameter is not present) |
340 request, profile.SUBMIT_MSG_PARAM_NAME, |
340 request, profile.SUBMIT_MSG_PARAM_NAME, |
341 values=profile.SUBMIT_MESSAGES)) |
341 values=profile.SUBMIT_MESSAGES)) |
342 |
342 |
343 # populate form with the existing User entity |
343 # populate form with the existing User entity |
344 form = EditForm(initial={'key_name': user.key().name(), |
344 form = EditForm(initial={'key_name': user.key().name(), |
345 'account': user.account.email(), 'link_name': user.link_name, |
345 'account': user.account.email(), 'link_id': user.link_id, |
346 'nick_name': user.nick_name, 'is_developer': user.is_developer}) |
346 'nick_name': user.nick_name, 'is_developer': user.is_developer}) |
347 else: |
347 else: |
348 if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME): |
348 if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME): |
349 # redirect to aggressively remove 'Profile saved' query parameter |
349 # redirect to aggressively remove 'Profile saved' query parameter |
350 return http.HttpResponseRedirect(request.path) |
350 return http.HttpResponseRedirect(request.path) |
351 |
351 |
352 context['lookup_error'] = ugettext_lazy( |
352 context['lookup_error'] = ugettext_lazy( |
353 'User with that link name not found.') |
353 'User with that link ID not found.') |
354 form = EditForm(initial={'link_name': link_name}) |
354 form = EditForm(initial={'link_id': link_id}) |
355 else: # no link name specified in the URL |
355 else: # no link ID specified in the URL |
356 if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME): |
356 if request.GET.get(profile.SUBMIT_MSG_PARAM_NAME): |
357 # redirect to aggressively remove 'Profile saved' query parameter |
357 # redirect to aggressively remove 'Profile saved' query parameter |
358 return http.HttpResponseRedirect(request.path) |
358 return http.HttpResponseRedirect(request.path) |
359 |
359 |
360 # no link name specified, so start with an empty form |
360 # no link ID specified, so start with an empty form |
361 form = EditForm() |
361 form = EditForm() |
362 |
362 |
363 context.update({'form': form, |
363 context.update({'form': form, |
364 'existing_user': user}) |
364 'existing_user': user}) |
365 |
365 |
376 """ |
376 """ |
377 account = forms.EmailField( |
377 account = forms.EmailField( |
378 label=soc.models.user.User.account.verbose_name, |
378 label=soc.models.user.User.account.verbose_name, |
379 help_text=soc.models.user.User.account.help_text) |
379 help_text=soc.models.user.User.account.help_text) |
380 |
380 |
381 link_name = forms.CharField( |
381 link_id = forms.CharField( |
382 label=soc.models.user.User.link_name.verbose_name, |
382 label=soc.models.user.User.link_id.verbose_name, |
383 help_text=soc.models.user.User.link_name.help_text) |
383 help_text=soc.models.user.User.link_id.help_text) |
384 |
384 |
385 nick_name = forms.CharField( |
385 nick_name = forms.CharField( |
386 label=soc.models.user.User.nick_name.verbose_name) |
386 label=soc.models.user.User.nick_name.verbose_name) |
387 |
387 |
388 is_developer = forms.BooleanField(required=False, |
388 is_developer = forms.BooleanField(required=False, |
390 help_text=soc.models.user.User.is_developer.help_text) |
390 help_text=soc.models.user.User.is_developer.help_text) |
391 |
391 |
392 class Meta: |
392 class Meta: |
393 model = None |
393 model = None |
394 |
394 |
395 def clean_link_name(self): |
395 def clean_link_id(self): |
396 link_name = self.cleaned_data.get('link_name') |
396 link_id = self.cleaned_data.get('link_id') |
397 if not validate.isLinkNameFormatValid(link_name): |
397 if not validate.isLinkIdFormatValid(link_id): |
398 raise forms.ValidationError("This link name is in wrong format.") |
398 raise forms.ValidationError("This link ID is in wrong format.") |
399 else: |
399 else: |
400 if models.user.logic.getForFields({'link_name': link_name}, |
400 if models.user.logic.getForFields({'link_id': link_id}, |
401 unique=True): |
401 unique=True): |
402 raise forms.ValidationError("This link name is already in use.") |
402 raise forms.ValidationError("This link ID is already in use.") |
403 return link_name |
403 return link_id |
404 |
404 |
405 def clean_account(self): |
405 def clean_account(self): |
406 new_email = self.cleaned_data.get('account') |
406 new_email = self.cleaned_data.get('account') |
407 form_account = users.User(email=new_email) |
407 form_account = users.User(email=new_email) |
408 if models.user.logic.getForFields({'account': form_account}, unique=True): |
408 if models.user.logic.getForFields({'account': form_account}, unique=True): |
442 if request.method == 'POST': |
442 if request.method == 'POST': |
443 form = CreateForm(request.POST) |
443 form = CreateForm(request.POST) |
444 |
444 |
445 if form.is_valid(): |
445 if form.is_valid(): |
446 form_account = form.cleaned_data.get('account') |
446 form_account = form.cleaned_data.get('account') |
447 link_name = form.cleaned_data.get('link_name') |
447 link_id = form.cleaned_data.get('link_id') |
448 |
448 |
449 properties = { |
449 properties = { |
450 'account': form_account, |
450 'account': form_account, |
451 'link_name': link_name, |
451 'link_id': link_id, |
452 'nick_name': form.cleaned_data.get('nick_name'), |
452 'nick_name': form.cleaned_data.get('nick_name'), |
453 'is_developer': form.cleaned_data.get('is_developer'), |
453 'is_developer': form.cleaned_data.get('is_developer'), |
454 } |
454 } |
455 |
455 |
456 key_fields = {'email': form_account.email()} |
456 key_fields = {'email': form_account.email()} |
458 key_fields) |
458 key_fields) |
459 |
459 |
460 if not user: |
460 if not user: |
461 return http.HttpResponseRedirect('/') |
461 return http.HttpResponseRedirect('/') |
462 |
462 |
463 # redirect to new /site/user/profile/new_link_name?s=0 |
463 # redirect to new /site/user/profile/new_link_id?s=0 |
464 # (causes 'Profile saved' message to be displayed) |
464 # (causes 'Profile saved' message to be displayed) |
465 return helper.responses.redirectToChangedSuffix( |
465 return helper.responses.redirectToChangedSuffix( |
466 request, 'create', 'edit/' + link_name, |
466 request, 'create', 'edit/' + link_id, |
467 params=profile.SUBMIT_PROFILE_SAVED_PARAMS) |
467 params=profile.SUBMIT_PROFILE_SAVED_PARAMS) |
468 else: # method == 'GET': |
468 else: # method == 'GET': |
469 # no link name specified, so start with an empty form |
469 # no link ID specified, so start with an empty form |
470 form = CreateForm() |
470 form = CreateForm() |
471 |
471 |
472 context['form'] = form |
472 context['form'] = form |
473 |
473 |
474 return helper.responses.respond(request, template, context) |
474 return helper.responses.respond(request, template, context) |