pytask/taskapp/views/user.py
branchbuildout
changeset 227 3c8f3b0e5b00
equal deleted inserted replaced
214:679c7e237052 227:3c8f3b0e5b00
       
     1 import os
       
     2 
       
     3 from django.http import HttpResponse, Http404
       
     4 from django.shortcuts import redirect, render_to_response
       
     5 from django.contrib.auth.models import User
       
     6 from django.contrib.auth.decorators import login_required
       
     7 
       
     8 from pytask.taskapp.models import Task, Profile, Request
       
     9 
       
    10 from pytask.taskapp.events.user import createUser
       
    11 from pytask.taskapp.events.request import reply_to_request
       
    12 
       
    13 from pytask.taskapp.forms.user import UserProfileEditForm, UserChoiceForm
       
    14 
       
    15 from pytask.taskapp.utilities.request import get_request, create_request
       
    16 from pytask.taskapp.utilities.notification import get_notification, create_notification
       
    17 from pytask.taskapp.utilities.user import get_user
       
    18 
       
    19 about = {
       
    20     "addmentors": "about/addmentors.html",
       
    21     "mentor": "about/mentor.html", 
       
    22     "starthere": "about/starthere.html",
       
    23     "task": "about/task.html",
       
    24     "tasklife": "about/tasklife.html",
       
    25     "developer": "about/developer.html",
       
    26     "notification": "about/notification.html",
       
    27     "request": "about/request.html",
       
    28     "manager": "about/manager.html",
       
    29     "admin": "about/admin.html",
       
    30 }
       
    31 
       
    32 def show_msg(user, message, redirect_url=None, url_desc=None):
       
    33     """ simply redirect to homepage """
       
    34     
       
    35     return render_to_response('show_msg.html',{'user':user, 'message':message, 'redirect_url':redirect_url, 'url_desc':url_desc})
       
    36 
       
    37 def homepage(request):
       
    38     """ check for authentication and display accordingly. """
       
    39    
       
    40     user = request.user
       
    41     is_guest = False
       
    42     is_mentor = False
       
    43     can_create_task = False
       
    44     task_list = []
       
    45     
       
    46     if not user.is_authenticated():
       
    47         is_guest = True
       
    48         disp_num = 10
       
    49         task_list = Task.objects.exclude(status="UP").exclude(status="CD").exclude(status="CM").order_by('published_datetime').reverse()[:10]
       
    50         return render_to_response('index.html', {'user':user, 'is_guest':is_guest, 'task_list':task_list})
       
    51         
       
    52     else:
       
    53         user = get_user(request.user)
       
    54         user_profile = user.get_profile()
       
    55         is_mentor = True if user.task_mentors.all() else False
       
    56         can_create_task = False if user_profile.rights == u"CT" else True
       
    57         
       
    58         context = {'user':user,
       
    59                    'is_guest':is_guest,
       
    60                    'is_mentor':is_mentor,
       
    61                    'task_list':task_list,
       
    62                    'can_create_task':can_create_task,
       
    63                    }
       
    64 
       
    65         context["unpublished_tasks"] = user.task_mentors.filter(status="UP")
       
    66         context["mentored_tasks"] = user.task_mentors.exclude(status="UP").exclude(status="CM").exclude(status="CD").exclude(status="DL")
       
    67         context["claimed_tasks"] = user.task_claimed_users.exclude(status="UP").exclude(status="CM").exclude(status="CD").exclude(status="DL")
       
    68         context["working_tasks"] = user.task_assigned_users.filter(status="WR")
       
    69                    
       
    70         return render_to_response('index.html', context)
       
    71 
       
    72 @login_required
       
    73 def learn_more(request, what):
       
    74     """ depending on what was asked for, we render different pages.
       
    75     """
       
    76 
       
    77     user = get_user(request.user)
       
    78     disp_template = about.get(what, None)
       
    79     if not disp_template:
       
    80         raise Http404
       
    81     else:
       
    82         return render_to_response(disp_template, {'user':user})
       
    83 
       
    84 @login_required
       
    85 def view_my_profile(request,uid=None):
       
    86     """ allows the user to view the profiles of users """
       
    87     user = get_user(request.user)
       
    88     request_user_profile = request.user.get_profile()
       
    89     request_user_privilege = True if request_user_profile.rights in ['AD','MG'] else False
       
    90     if uid == None:
       
    91         edit_profile = True
       
    92         profile = Profile.objects.get(user = request.user)
       
    93         return render_to_response('user/my_profile.html', {'edit_profile':edit_profile,'profile':profile, 'user':user, 'privilege':request_user_privilege})
       
    94     edit_profile = True if request.user == User.objects.get(pk=uid) else False
       
    95     try:
       
    96         profile = Profile.objects.get(user = User.objects.get(pk=uid))
       
    97     except Profile.DoesNotExist:
       
    98         raise Http404
       
    99     return render_to_response('user/my_profile.html', {'edit_profile':edit_profile,'profile':profile, 'user':user, 'privilege':request_user_privilege})
       
   100 
       
   101 @login_required
       
   102 def edit_my_profile(request):
       
   103     """ enables the user to edit his/her user profile """
       
   104 
       
   105     user = get_user(request.user)
       
   106     user_profile = user.get_profile()
       
   107 
       
   108     edit_profile_form = UserProfileEditForm(instance = user_profile)
       
   109     if request.method == 'POST':
       
   110 
       
   111         data = request.POST.copy()
       
   112         uploaded_photo = request.FILES.get('photo', None)
       
   113         data.__setitem__('photo', uploaded_photo)
       
   114 
       
   115         edit_profile_form = UserProfileEditForm(data, instance=user_profile)
       
   116         if edit_profile_form.is_valid():
       
   117             edit_profile_form.save()
       
   118             return redirect('/user/view/uid='+str(user.id))
       
   119         else:
       
   120             return render_to_response('user/edit_profile.html',{'user':user, 'edit_profile_form' : edit_profile_form})
       
   121     else:
       
   122         profile = user.get_profile()
       
   123         edit_profile_form = UserProfileEditForm(instance = profile)
       
   124         return render_to_response('user/edit_profile.html',{'edit_profile_form' : edit_profile_form, 'user':user})
       
   125 
       
   126 @login_required
       
   127 def browse_requests(request):
       
   128     
       
   129     user = get_user(request.user)
       
   130     active_reqs = user.request_sent_to.filter(is_replied=False).exclude(is_valid=False)
       
   131     reqs = active_reqs.order_by('creation_date').reverse()
       
   132 
       
   133     context = {
       
   134         'user':user,
       
   135         'reqs':reqs,
       
   136     }
       
   137 
       
   138     return render_to_response('user/browse_requests.html', context)
       
   139 
       
   140 @login_required
       
   141 def view_request(request, rid):
       
   142     """ please note that request variable in this method is that of django.
       
   143     our app request is called user_request.
       
   144     """
       
   145 
       
   146     user = get_user(request.user)
       
   147     user_rights = user.get_profile().rights
       
   148     newest, newer, user_request, older, oldest = get_request(rid, user)
       
   149     if not user_request:
       
   150         raise Http404
       
   151 
       
   152     user_request.is_read = True
       
   153     user_request.save()
       
   154 
       
   155     context = {
       
   156         'user':user,
       
   157         'req':user_request,
       
   158         'sent_users':user_request.sent_to.all(),
       
   159         'newest':newest,
       
   160         'newer':newer,
       
   161         'older':older,
       
   162         'oldest':oldest,
       
   163     }
       
   164 
       
   165     return render_to_response('user/view_request.html', context)
       
   166 
       
   167 @login_required
       
   168 def process_request(request, rid, reply):
       
   169     """ check if the method is post and then update the request.
       
   170     if it is get, display a 404 error.
       
   171     """
       
   172 
       
   173     user = get_user(request.user)
       
   174     browse_request_url= '/user/requests'
       
   175     newest, newer, req_obj, older, oldest = get_request(rid, user)
       
   176 
       
   177     if not req_obj:
       
   178         return show_msg(user, "Your reply has been processed", browse_request_url, "view other requests")
       
   179 
       
   180     if request.method=="POST":
       
   181         reply = True if reply == "yes" else False
       
   182         req_obj.remarks = request.POST.get('remarks', "")
       
   183         req_obj.save()
       
   184 
       
   185         reply_to_request(req_obj, reply, user)
       
   186 
       
   187         return redirect('/user/requests/')
       
   188         return show_msg(user, "Your reply has been processed", browse_request_url, "view other requests")
       
   189     else:
       
   190         return show_msg(user, "You are not authorised to do this", browse_request_url, "view other requests")
       
   191 
       
   192 @login_required
       
   193 def browse_notifications(request):
       
   194     """ get the list of notifications that are not deleted and display in datetime order.
       
   195     """
       
   196 
       
   197     user = get_user(request.user)
       
   198 
       
   199     active_notifications = user.notification_sent_to.filter(is_deleted=False).order_by('sent_date').reverse()
       
   200 
       
   201     context = {
       
   202         'user':user,
       
   203         'notifications':active_notifications,
       
   204     }
       
   205 
       
   206     return render_to_response('user/browse_notifications.html', context)
       
   207 
       
   208 @login_required
       
   209 def view_notification(request, nid):
       
   210     """ get the notification depending on nid.
       
   211     Display it.
       
   212     """
       
   213 
       
   214     user = get_user(request.user)
       
   215     newest, newer, notification, older, oldest = get_notification(nid, user)
       
   216     if not notification:
       
   217         raise Http404
       
   218 
       
   219     notification.is_read = True
       
   220     notification.save()
       
   221 
       
   222     context = {
       
   223         'user':user,
       
   224         'notification':notification,
       
   225         'newest':newest,
       
   226         'newer':newer,
       
   227         'older':older,
       
   228         'oldest':oldest,
       
   229     }
       
   230 
       
   231     return render_to_response('user/view_notification.html', context)
       
   232 
       
   233 @login_required
       
   234 def edit_notification(request, nid, action):
       
   235     """ if action is delete, set is_deleted.
       
   236     if it is unread, unset is_read.
       
   237     save the notification and redirect to browse_notifications.
       
   238     """
       
   239 
       
   240     user = get_user(request.user)
       
   241     newest, newer, notification, older, oldest = get_notification(nid, user)
       
   242 
       
   243     if not notification:
       
   244         raise Http404
       
   245 
       
   246     notifications_url = "/user/notifications/"
       
   247 
       
   248     if request.method == "POST":
       
   249         if action == "delete":
       
   250             notification.is_deleted = True
       
   251         elif action == "unread":
       
   252             notification.is_read = False
       
   253         
       
   254         notification.save()
       
   255         if older:
       
   256             return redirect('/user/notifications/nid=%s'%older.id)
       
   257         else:
       
   258             return redirect(notifications_url)
       
   259     else:
       
   260         return show_msg(user, 'This is wrong', notification_url, "view the notification")
       
   261  
       
   262 @login_required
       
   263 def change_rights(request, role):
       
   264     """ check if the current user has privileges to do this.
       
   265     """
       
   266     
       
   267     user = get_user(request.user)
       
   268     role = role.upper()
       
   269     user_profile = user.get_profile()
       
   270     user_rights = user_profile.rights
       
   271 
       
   272     user_can_view = True if user_rights == "AD" or ( user_rights == "MG" and role in ["MG", "DV"] ) else False
       
   273 
       
   274     if user_can_view:
       
   275         if role == "DV":
       
   276             current_contributors = list(User.objects.filter(is_active=True,profile__rights="CT"))
       
   277             pending_requests = user.request_sent_by.filter(is_replied=False,is_valid=True)
       
   278             pending_dv_requests = pending_requests.filter(role="DV")
       
   279 
       
   280             ## one cannot make same request many times
       
   281             for req in pending_dv_requests:
       
   282                 current_contributors.remove(req.sent_to.all()[0])
       
   283 
       
   284             choices = [ (_.id,_.username ) for _ in current_contributors ]
       
   285 
       
   286         elif role == "MG":
       
   287             active_users = User.objects.filter(is_active=True)
       
   288             dv_ct_users = list(active_users.filter(profile__rights="CT") | active_users.filter(profile__rights="DV"))
       
   289             pending_requests = user.request_sent_by.filter(is_replied=False,is_valid=True)
       
   290             pending_mg_requests = pending_requests.filter(role="MG")
       
   291 
       
   292             ## same logic here. you cannot make another request exactly the same.
       
   293             ## but iam still not decided whether someone who requests a user to be admin,
       
   294             ## can be given a chance to request the same user to be a manager or developer
       
   295             for req in pending_mg_requests:
       
   296                 dv_ct_users.remove(req.sent_to.all()[0])
       
   297 
       
   298             choices = [ (_.id, _.username ) for _ in dv_ct_users ]
       
   299 
       
   300         elif role == "AD":
       
   301             active_users = User.objects.filter(is_active=True)
       
   302             non_ad_users = list(active_users.exclude(profile__rights="AD"))
       
   303             pending_requests = user.request_sent_by.filter(is_replied=False,is_valid=True)
       
   304             pending_ad_requests = pending_requests.filter(role="AD")
       
   305 
       
   306             ## we filter out users who have already been requested by the user to be an admin
       
   307             for req in pending_ad_requests:
       
   308                 non_ad_users.remove(req.sent_to.all()[0])
       
   309 
       
   310             choices = [ (_.id,_.username ) for _ in non_ad_users ]
       
   311 
       
   312         form = UserChoiceForm(choices)
       
   313 
       
   314         context = {
       
   315             'user':user,
       
   316             'form':form,
       
   317         }
       
   318 
       
   319         if request.method=="POST":
       
   320             data = request.POST
       
   321             form = UserChoiceForm(choices, data)
       
   322             if form.is_valid():
       
   323                 user_to_change = User.objects.get(id=form.cleaned_data['user'])
       
   324                 create_request(sent_by=user, role=role, sent_to=user_to_change)
       
   325                 return show_msg(user, "A request has been sent", "/", "return to home page")
       
   326             else:
       
   327                 raise Http404
       
   328         else:
       
   329             return render_to_response('user/changerole.html', context)
       
   330     else:
       
   331         raise Http404
       
   332 
       
   333 
       
   334 
       
   335 
       
   336 
       
   337 
       
   338 
       
   339 
       
   340 
       
   341 
       
   342 
       
   343 
       
   344 
       
   345 
       
   346 
       
   347