app/soc/views/user/profile.py
changeset 118 d2e61a490969
parent 99 8c38b546a3cf
child 124 051afb721c22
equal deleted inserted replaced
117:6e44a4478ece 118:d2e61a490969
    12 # distributed under the License is distributed on an "AS IS" BASIS,
    12 # distributed under the License is distributed on an "AS IS" BASIS,
    13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14 # See the License for the specific language governing permissions and
    14 # See the License for the specific language governing permissions and
    15 # limitations under the License.
    15 # limitations under the License.
    16 
    16 
    17 """Views relevant to the User role.
    17 """Views for editing and examining User profiles.
    18 """
    18 """
    19 
    19 
    20 __authors__ = [
    20 __authors__ = [
    21   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    21   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    22   ]
    22   ]
    26 from google.appengine.api import users
    26 from google.appengine.api import users
    27 from django import http
    27 from django import http
    28 from django import shortcuts
    28 from django import shortcuts
    29 from django import newforms as forms
    29 from django import newforms as forms
    30 
    30 
       
    31 from soc.logic.site import id_user
    31 from soc.views.helpers import forms_helpers
    32 from soc.views.helpers import forms_helpers
    32 from soc.views.helpers import response_helpers
    33 from soc.views.helpers import response_helpers
    33 
    34 
    34 import soc.models.user
    35 import soc.models.user
       
    36 
    35 
    37 
    36 class UserForm(forms_helpers.DbModelForm):
    38 class UserForm(forms_helpers.DbModelForm):
    37   """Django form displayed when creating or editing a User.
    39   """Django form displayed when creating or editing a User.
    38   """
    40   """
    39   LINKNAME_PATTERN = r'''(?x)
    41   LINKNAME_PATTERN = r'''(?x)
    44       |         # -OR-
    46       |         # -OR-
    45       _[0-9a-z] # underscore and ASCII digit or lowercase
    47       _[0-9a-z] # underscore and ASCII digit or lowercase
    46       )*        # zero or more of OR group
    48       )*        # zero or more of OR group
    47       $'''
    49       $'''
    48   LINKNAME_REGEX = re.compile(LINKNAME_PATTERN)
    50   LINKNAME_REGEX = re.compile(LINKNAME_PATTERN)
    49 
       
    50   
    51   
    51   class Meta:
    52   class Meta:
    52     """Inner Meta class that defines some behavior for the form.
    53     """Inner Meta class that defines some behavior for the form.
    53     """
    54     """
    54     #: db.Model subclass for which the form will gather information
    55     #: db.Model subclass for which the form will gather information
    57     #: list of model fields which will *not* be gathered by the form
    58     #: list of model fields which will *not* be gathered by the form
    58     exclude = ['id']
    59     exclude = ['id']
    59   
    60   
    60   def clean_link_name(self):
    61   def clean_link_name(self):
    61     linkname = self.cleaned_data.get('link_name')
    62     linkname = self.cleaned_data.get('link_name')
    62     linkname_user = soc.models.user.User.getUserForLinkname(linkname)
    63     linkname_user = id_user.getUserFromLinkName(linkname)
    63     current_id = users.get_current_user()
    64     id = users.get_current_user()
    64     # if linkname exist in datastore and doesn't belong to current user
    65     # if linkname exist in datastore and doesn't belong to current user
    65     if linkname_user and (linkname_user.id != current_id):
    66     if linkname_user and (linkname_user.id != id):
    66       raise forms.ValidationError("This link name is already in use.")
    67       raise forms.ValidationError("This link name is already in use.")
    67     elif not self.LINKNAME_REGEX.match(linkname):
    68     elif not self.LINKNAME_REGEX.match(linkname):
    68       raise forms.ValidationError("This link name is in wrong format.")
    69       raise forms.ValidationError("This link name is in wrong format.")
    69     return linkname
    70     return linkname
    70 
    71 
    97   if not current_id and not linkname:
    98   if not current_id and not linkname:
    98     return http.HttpResponseRedirect(users.create_login_url(request.path))
    99     return http.HttpResponseRedirect(users.create_login_url(request.path))
    99   elif not current_id and linkname:
   100   elif not current_id and linkname:
   100     return public(request, linkname)
   101     return public(request, linkname)
   101     
   102     
   102   user = soc.models.user.User.getUserForId(current_id)
   103   user = id_user.getUserFromId(current_id)
   103   
   104   
   104   #: Show custom 404 page when linkname doesn't exist in datastore
   105   #: Show custom 404 page when linkname doesn't exist in datastore
   105   #: or show public view for linkname user
   106   #: or show public view for linkname user
   106   if linkname:
   107   if linkname:
   107     linkname_user = soc.models.user.User.getUserForLinkname(linkname)
   108     linkname_user = id_user.getUserFromLinkName(linkname)
   108     if not linkname_user:
   109     if not linkname_user:
   109       return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   110       return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   110                                 linkname)
   111                                        linkname)
   111     elif linkname_user and (linkname_user.id != current_id):
   112     elif linkname_user and (linkname_user.id != current_id):
   112       return public(request, linkname)
   113       return public(request, linkname)
   113 
   114 
   114   #: GET method
   115   #: GET method
   115   if (request.method != 'POST') and user:
   116   if (request.method != 'POST') and user:
   116     form = UserForm(initial={'nick_name': user.nick_name,
   117     form = UserForm(initial={'nick_name': user.nick_name,
   117                              'link_name': user.link_name})
   118                              'link_name': user.link_name})
   118     return response_helpers.respond(request,
   119     return response_helpers.respond(request,
   119         template, {'template': template, 
   120         template, {'template': template, 
   120                    'form': form, 
   121                    'form': form})
   121                    'user': user})
       
   122   
   122   
   123   #: POST method
   123   #: POST method
   124   form = UserForm()
   124   form = UserForm()
   125   if request.method == 'POST':
   125   if request.method == 'POST':
   126     form = UserForm(request.POST)
   126     form = UserForm(request.POST)
   127 
   127 
   128     if form.is_valid():
   128     if form.is_valid():
   129       linkname = form.cleaned_data.get('link_name')
   129       linkname = form.cleaned_data.get('link_name')
   130       nickname = form.cleaned_data.get("nick_name")
   130       nickname = form.cleaned_data.get("nick_name")
   131       if not user:
   131       if not user:
   132         user = soc.models.user.User(id = user,link_name = linkname,
   132         user = soc.models.user.User(id=id,link_name=linkname,
   133                                         nick_name = nickname)
   133                                     nick_name=nickname)
   134       else:
   134       else:
   135         user.nick_name = nickname
   135         user.nick_name = nickname
   136         user.link_name = linkname
   136         user.link_name = linkname
   137       user.put()
   137       user.put()
   138       return response_helpers.respond(request,
   138       return response_helpers.respond(request,
   139               template, {'template': template, 
   139               template, {'template': template, 
   140                          'form': form, 
   140                          'form': form,
   141                          'user': user,
       
   142                          'submit_message': 'Profile saved.'})
   141                          'submit_message': 'Profile saved.'})
   143 
   142 
   144   return response_helpers.respond(request,
   143   return response_helpers.respond(request,
   145       template, {'template': template, 'form': form})
   144       template, {'template': template, 'form': form})
   146 
   145 
   158     A subclass of django.http.HttpResponse with generated template.
   157     A subclass of django.http.HttpResponse with generated template.
   159   """
   158   """
   160   #: If linkname is empty or not a valid linkname on the site, display
   159   #: If linkname is empty or not a valid linkname on the site, display
   161   #: "user does not exist", otherwise render public view for linkname user
   160   #: "user does not exist", otherwise render public view for linkname user
   162   if linkname:
   161   if linkname:
   163     linkname_user = soc.models.user.User.getUserForLinkname(linkname)
   162     linkname_user = id_user.getUserFromLinkName(linkname)
   164     if not linkname_user:
   163     if not linkname_user:
   165       return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   164       return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   166                                 linkname)
   165                                        linkname)
   167     else:
   166     else:
   168       return response_helpers.respond(request, 
   167       return response_helpers.respond(request, 
   169           template, {'template': template,
   168           template, {'template': template,
   170                      'user': linkname_user})
   169                      'user': linkname_user})
   171       
   170       
   172   return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   171   return http.HttpResponseNotFound('No user exists with that link name "%s"' %
   173                             linkname)
   172                                    linkname)