app/soc/views/site/user/profile.py
changeset 205 4a86df751222
parent 190 b1351bf81064
child 210 d05444cf4641
--- a/app/soc/views/site/user/profile.py	Fri Sep 26 19:47:07 2008 +0000
+++ b/app/soc/views/site/user/profile.py	Mon Sep 29 14:03:45 2008 +0000
@@ -169,7 +169,7 @@
 
 
 class EditForm(forms_helpers.DbModelForm):
-  """Django form displayed when Developer creates or edits a User.
+  """Django form displayed when Developer edits a User.
   
   This form is manually specified, instead of using
     model = soc.models.user.User
@@ -319,3 +319,99 @@
                   'existing_user': user})
 
   return response_helpers.respond(request, template, context)
+
+
+class CreateForm(forms_helpers.DbModelForm):
+  """Django form displayed when Developer creates a User.
+
+  This form is manually specified, instead of using
+    model = soc.models.user.User
+  in the Meta class, because the form behavior is unusual and normally
+  required Properties of the User model need to sometimes be omitted.
+  """
+  id = forms.EmailField(
+      label=soc.models.user.User.id.verbose_name,
+      help_text=soc.models.user.User.id.help_text)
+
+  link_name = forms.CharField(
+      label=soc.models.user.User.link_name.verbose_name,
+      help_text=soc.models.user.User.link_name.help_text)
+
+  nick_name = forms.CharField(
+      label=soc.models.user.User.nick_name.verbose_name)
+
+  is_developer = forms.BooleanField(required=False,
+      label=soc.models.user.User.is_developer.verbose_name,
+      help_text=soc.models.user.User.is_developer.help_text)
+  
+  class Meta:
+    model = None
+  
+  
+  def clean_link_name(self):
+    link_name = self.cleaned_data.get('link_name')
+    if not id_user.isLinkNameFormatValid(link_name):
+      raise forms.ValidationError("This link name is in wrong format.")
+    else:
+      if id_user.doesLinkNameExist(link_name):
+        raise forms.ValidationError("This link name is already in use.")
+    return link_name
+
+  def clean_id(self):
+    new_email = self.cleaned_data.get('id')
+    form_id = users.User(email=new_email)
+    if id_user.isIdUser(form_id):
+        raise forms.ValidationError("This account is already in use.")
+    return form_id
+
+
+DEF_SITE_CREATE_USER_PROFILE_TMPL = 'soc/site/user/profile/edit.html'
+
+def create(request, template=DEF_SITE_CREATE_USER_PROFILE_TMPL):
+  """View for a Developer to modify the properties of a User Model entity.
+
+  Args:
+    request: the standard django request object
+    template: the "sibling" template (or a search list of such templates)
+      from which to construct the public.html template name (or names)
+
+  Returns:
+    A subclass of django.http.HttpResponse which either contains the form to
+    be filled out, or a redirect to the correct view in the interface.
+  """
+  # create default template context for use with any templates
+  context = response_helpers.getUniversalContext(request)
+
+  alt_response = simple.getAltResponseIfNotDeveloper(request,
+                                                     context=context)
+  if alt_response:
+    return alt_response
+
+  if request.method == 'POST':
+    form = CreateForm(request.POST)
+
+    if form.is_valid():
+      form_id = form.cleaned_data.get('id')
+      new_linkname = form.cleaned_data.get('link_name')
+      nickname = form.cleaned_data.get('nick_name')
+      is_developer = form.cleaned_data.get('is_developer')
+
+      user = id_user.updateOrCreateUserFromId(id=form_id, 
+          link_name=new_linkname, nick_name=nickname, 
+          is_developer=is_developer)
+
+      if not user:
+        return http.HttpResponseRedirect('/')
+
+      # redirect to new /site/user/profile/new_linkname?s=0
+      # (causes 'Profile saved' message to be displayed)
+      return response_helpers.redirectToChangedSuffix(
+          request, None, new_linkname,
+          params=profile.SUBMIT_PROFILE_SAVED_PARAMS)
+  else: # method == 'GET':
+    # no link name specified, so start with an empty form
+    form = CreateForm()
+
+  context.update({'form': form})
+
+  return response_helpers.respond(request, template, context)
\ No newline at end of file