def add_risk(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project if request.method == 'POST': form = RiskForm(request.POST) if form.is_valid(): t = form.save(commit=False) t.risk_number = '''RISK-%s-%s''' % ( request.user.username[:2].upper(), time.strftime("%Y%m%d%H%M")) t.rating = _calculate_risk(t.probability, t.impact) t.save() project.risks.add(t) project.save() request.user.message_set.create(message='''Risk %s Registered''' % t.risk_number) updateLog(request, project.project_number, '''Risk %s Registered''' % t.risk_number) return HttpResponse(return_json_success()) else: return HttpResponse(handle_form_errors(form.errors))
def view_project(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project return render_to_response('projects/view-project.html', { 'project': project }, context_instance=RequestContext(request))
def view_issues(request, project_number): project = Project.objects.get(project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project return HttpResponse( serializers.serialize('json', project.issues.all(), relations={'owner': {'fields': ('username',), 'extras': ('get_full_name',)}, 'author': {'fields': ('username',), 'extras': ('get_full_name',)},}, extras=('get_history_html',) , display=['type', 'status', 'priority']))
def get_skillset(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project return HttpResponse(serializers.serialize('json', SkillSet.objects.all()))
def view_lesson(request, project_number, lesson_id): project = Project.objects.get(project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project lesson = LessonLearnt.objects.get(id=lesson_id) JSONSerializer = serializers.get_serializer('json') j = JSONSerializer() j.serialize([lesson], fields=('description', 'publish_to_client')) return HttpResponse( '''{ success: true, data: %s }''' % json.dumps(j.objects[0]['fields']))
def view_project(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project return render_to_response('projects/view-project.html', {'project': project}, context_instance=RequestContext(request))
def delete_issue(request, project_number, issue_id): project = Project.objects.get(project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project try: issue = Issue.objects.get(id=issue_id) except: return HttpResponse( handle_generic_error("Issue does not exist")) project.issues.remove(issue) project.save() return HttpResponse( return_json_success() )
def delete_deliverable(request, project_number, deliverable_id): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project if user_has_write_access(project, request.user): deliverable = Deliverable.objects.get(id=deliverable_id) project.deliverables.remove(deliverable) project.save() return HttpResponse(return_json_success()) else: return HttpResponse(handle_generic_error("Sorry - you don't have sufficient access to update the project"))
def view_lesson(request, project_number, lesson_id): project = Project.objects.get(project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project lesson = LessonLearnt.objects.get(id=lesson_id) JSONSerializer = serializers.get_serializer('json') j = JSONSerializer() j.serialize([lesson], fields=('description', 'publish_to_client')) return HttpResponse('''{ success: true, data: %s }''' % json.dumps(j.objects[0]['fields']))
def delete_issue(request, project_number, issue_id): project = Project.objects.get(project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project try: issue = Issue.objects.get(id=issue_id) except: return HttpResponse(handle_generic_error("Issue does not exist")) project.issues.remove(issue) project.save() return HttpResponse(return_json_success())
def get_timeline(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project t_format = "%a %b %d %H:%M:%S %Y +0000" ret = {} ret['events'] = [] for w in project.work_items.all(): dict = {} do_not_append = False if w.start_date and w.duration: dict['start'] = w.start_date.strftime(t_format) dict['durationEvent'] = True if project.duration_type == 0: # Hours end = w.start_date + datetime.timedelta(hours=w.duration) dict['end'] = end.strftime(t_format) elif project.duration_type == 1: # Days end = w.start_date + datetime.timedelta(days=w.duration) dict['end'] = end.strftime(t_format) elif w.finish_date and w.duration: dict['end'] = w.finish_date.strftime(t_format) dict['durationEvent'] = True if project.duration_type == 0: # Hours end = w.finish_date + datetime.timedelta(hours=-w.duration) dict['start'] = end.strftime(t_format) elif project.duration_type == 1: # Days end = w.finish_date + datetime.timedelta(days=-w.duration) dict['start'] = end.strftime(t_format) elif w.start_date and w.finish_date: dict['start'] = w.start_date.strftime(t_format) dict['end'] = w.finish_date.strftime(t_format) dict['durationEvent'] = True else: do_not_append = True # Can't add to Timeline dict['title'] = w.title dict['description'] = w.description rag_status = get_task_rag_status(w) if rag_status == 'rag_status_red': dict['color'] = '#ff0000' elif rag_status == 'rag_status_amber': dict['color'] = '#ff9900' if w.percent_complete == 100: dict['color'] = '#00ff00' if not do_not_append: ret['events'].append(dict) return HttpResponse( json.dumps(ret) )
def edit_wbs(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project forms = {} forms['WBSReorderForm'] = WBSReorderForm() forms['WBSForm'] = WBSForm(project) if request.method == 'POST': pass else: return render_to_response('wbs/edit_wbs.html', {'project': project, 'forms': forms}, context_instance=RequestContext(request))
def view_lessons(request, project_number): project = Project.objects.get(project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project return HttpResponse( serializers.serialize('json', project.lessons_learnt.all(), relations={ 'author': { 'fields': ('username', ), 'extras': ('get_full_name', ) } }))
def get_team_managers(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project return HttpResponse( serializers.serialize( 'json', User.objects.filter(id__in=project.team_managers.all()).distinct( ).order_by('first_name'), extras=('get_full_name', ), excludes=('is_active', 'is_superuser', 'is_staff', 'last_login', 'groups', 'user_permissions', 'password', 'email', 'date_joined')))
def add_deliverable(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project if request.method == "POST": form = DeliverableForm(request.POST) if form.is_valid(): t = form.save() t.save() project.deliverables.add(t) project.save() request.user.message_set.create(message="""Deliverable %s Registered""" % t.id) updateLog(request, project_number, """Deliverable %s Registered""" % t.id) return HttpResponse(return_json_success()) else: return HttpResponse(handle_form_errors(form.errors))
def view_wbs(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project wbs = project.work_items.all() # Data cleaning, ExtJS grids can't load if some ForiegnKey fields are Null for w in wbs: if not w.depends: w.depends = WorkItem(title='') try: i = w.owner except User.DoesNotExist: w.owner = User() return HttpResponse( serializers.serialize('json', wbs, relations={'depends': {'fields': ('title',)}, 'skill_set': {'fields': ('skill',)}, 'project_stage': {'fields': ('stage',)},'author': {'fields': ('id', 'username'), 'extras': ('get_full_name',)},'owner': { 'fields': ('id', 'username'), 'extras': ('get_full_name',)}}, extras=('get_work_item_status', 'get_history_html',)))
def read(self, request, project_number): log.debug("GET request from user %s for project %s resources" % ( request.user, project_number )) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return User.objects.filter(is_active=True, groups__in=proj.read_acl.all()).distinct().order_by('first_name')
def read(self, request, project_number): log.debug("GET request from user %s for project %s team managers" % ( request.user, project_number )) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return User.objects.filter(id__in=proj.team_managers.all()).distinct().order_by('first_name')
def delete_deliverable(request, project_number, deliverable_id): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project if user_has_write_access(project, request.user): deliverable = Deliverable.objects.get(id=deliverable_id) project.deliverables.remove(deliverable) project.save() return HttpResponse(return_json_success()) else: return HttpResponse( handle_generic_error( "Sorry - you don't have sufficient access to update the project" ))
def edit_pid(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project JSONSerializer = serializers.get_serializer('json') j = JSONSerializer() j.serialize([project], fields=('project_name', 'project_number', 'project_status', 'company', 'project_manager', 'team_managers', 'project_sponsor', 'project_description', 'business_case', 'business_benefits', 'project_scope', 'exclusions', 'assumptions', 'communications_plan', 'quality_plan', 'duration_type')) return HttpResponse('''{ success: true, data: %s }''' % json.dumps(j.objects[0]['fields']))
def read(self, request, project_number): """ View a project """ log.debug("GET request from user %s for project number %s" % ( request.user, project_number )) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return proj
def add_risk(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project if request.method == 'POST': form = RiskForm(request.POST) if form.is_valid(): t = form.save(commit=False) t.risk_number = '''RISK-%s-%s''' % (request.user.username[:2].upper(), time.strftime("%Y%m%d%H%M")) t.rating = _calculate_risk(t.probability, t.impact) t.save() project.risks.add(t) project.save() request.user.message_set.create(message='''Risk %s Registered''' % t.risk_number) updateLog(request, project.project_number, '''Risk %s Registered''' % t.risk_number) return HttpResponse( return_json_success() ) else: return HttpResponse( handle_form_errors(form.errors))
def read(self, request, project_number, stageplan_id): """ View a Project Stage """ log.debug("GET request from user %s for project stage %s" % ( request.user, stageplan_id )) proj = Project.objects.get(project_number=project_number) stage = ProjectStage.objects.get(id=stageplan_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return stage
def read(self, request, project_number): """ Return a list of engineering days associated with projects filtered by ACL """ log.debug("GET request from user %s for eday list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return EngineeringDays.objects.filter(work_items__project_stage__project=proj)
def read(self, request, project_number, issue_id): """ View an issue """ log.debug("GET request from user %s for issue id %s" % ( request.user, issue_id )) proj = Project.objects.get(project_number=project_number) issue = Issue.objects.get(id=issue_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return issue
def read(self, request, project_number): """ Return a list of issues associated with projects filtered by ACL """ log.debug("GET request from user %s for risk list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return proj.issues.all()
def read(self, request, project_number, deliverable_id): """ View a deliverable """ log.debug("GET request from user %s for deliverable %s" % ( request.user, deliverable_id )) proj = Project.objects.get(project_number=project_number) deliverable = Deliverable.objects.get(id=deliverable_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return deliverable
def read(self, request, project_number, eday_id): """ View an Engineering Day """ log.debug("GET request from user %s for engineering day %s" % ( request.user, eday_id )) proj = Project.objects.get(project_number=project_number) eday = EngineeringDay.objects.get(id=eday_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return eday
def read(self, request, project_number, wbs_id): """ View a work item """ log.debug("GET request from user %s for work item %s" % ( request.user, wbs_id )) proj = Project.objects.get(project_number=project_number) wbs = WorkItem.objects.get(id=wbs_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return wbs
def read(self, request, project_number): """ Get a list of all Work Items for the project """ log.debug("GET request from user %s for wbs list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return WorkItem.objects.filter(project_stage__project=proj)
def read(self, request, project_number, lesson_id): """ View a lesson """ log.debug("GET request from user %s for lesson %s" % ( request.user, lesson_id )) proj = Project.objects.get(project_number=project_number) lesson = LessonLearnt.objects.get(id=lesson_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return lesson
def read(self, request, project_number, risk_number): """ View a risk """ log.debug("GET request from user %s for risk number %s" % ( request.user, risk_number )) proj = Project.objects.get(project_number=project_number) risk = Risk.objects.get(risk_number=risk_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return risk
def read(self, request, project_number): """ Return a list of risks associated with projects filtered by ACL """ log.debug("GET request from user %s for risk list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return proj.risks.all()
def view_issues(request, project_number): project = Project.objects.get(project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project return HttpResponse( serializers.serialize('json', project.issues.all(), relations={ 'owner': { 'fields': ('username', ), 'extras': ('get_full_name', ) }, 'author': { 'fields': ('username', ), 'extras': ('get_full_name', ) }, }, extras=('get_history_html', ), display=['type', 'status', 'priority']))
def read(self, request, project_number): """ Return a list of engineering days associated with a work item """ log.debug("GET request from user %s for stage plan list" % request.user) proj = Project.objects.get(project_number=project_number) wbs = WorkItem.objects.get(id=wbs_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN return wbs.engineering_days.all()
def read(self, request, project_number): """ Get a list of all Work Items for the project """ log.debug("GET request from user %s for wbs list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return WorkItem.objects.filter(project_stage__project=proj)
def read(self, request, project_number): log.debug("GET request from user %s for project %s team managers" % (request.user, project_number)) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return User.objects.filter( id__in=proj.team_managers.all()).distinct().order_by('first_name')
def add_deliverable(request, project_number): # Some security - only allow users to view objects they are allowed to via read_acl project = get_object_or_404(Project, project_number=project_number) check_project_read_acl( project, request.user ) # Will return Http404 if user isn't allowed to view project if request.method == 'POST': form = DeliverableForm(request.POST) if form.is_valid(): t = form.save() t.save() project.deliverables.add(t) project.save() request.user.message_set.create( message='''Deliverable %s Registered''' % t.id) updateLog(request, project_number, '''Deliverable %s Registered''' % t.id) return HttpResponse(return_json_success()) else: return HttpResponse(handle_form_errors(form.errors))
def read(self, request, project_number, stageplan_id): """ View a Project Stage """ log.debug("GET request from user %s for project stage %s" % (request.user, stageplan_id)) proj = Project.objects.get(project_number=project_number) stage = ProjectStage.objects.get(id=stageplan_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return stage
def read(self, request, project_number): log.debug("GET request from user %s for project %s resources" % (request.user, project_number)) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return User.objects.filter( is_active=True, groups__in=proj.read_acl.all()).distinct().order_by('first_name')
def read(self, request, project_number, eday_id): """ View an Engineering Day """ log.debug("GET request from user %s for engineering day %s" % (request.user, eday_id)) proj = Project.objects.get(project_number=project_number) eday = EngineeringDay.objects.get(id=eday_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return eday
def read(self, request, project_number, wbs_id): """ View a work item """ log.debug("GET request from user %s for work item %s" % (request.user, wbs_id)) proj = Project.objects.get(project_number=project_number) wbs = WorkItem.objects.get(id=wbs_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return wbs
def read(self, request, project_number): """ Return a list of engineering days associated with projects filtered by ACL """ log.debug("GET request from user %s for eday list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return EngineeringDays.objects.filter( work_items__project_stage__project=proj)
def read(self, request, project_number, deliverable_id): """ View a deliverable """ log.debug("GET request from user %s for deliverable %s" % (request.user, deliverable_id)) proj = Project.objects.get(project_number=project_number) deliverable = Deliverable.objects.get(id=deliverable_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return deliverable
def read(self, request, project_number): """ Return a list of engineering days associated with a work item """ log.debug("GET request from user %s for stage plan list" % request.user) proj = Project.objects.get(project_number=project_number) wbs = WorkItem.objects.get(id=wbs_id) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN return wbs.engineering_days.all()
def view_work_item(request, project_number, wbs_id): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project work_item = WorkItem.objects.get(id=wbs_id) # Some error checking if not work_item.depends: work_item.depends = WorkItem(title='') try: i = work_item.owner except User.DoesNotExist: work_item.owner = User() JSONSerializer = serializers.get_serializer('json') j = JSONSerializer() if work_item.start_date != None: work_item.start_date = work_item.start_date.strftime("%d/%m/%Y") if work_item.finish_date != None: work_item.finish_date = work_item.finish_date.strftime("%d/%m/%Y") j.serialize([work_item], fields=('skill_set', 'project_stage', 'title', 'description', 'depends', 'duration', 'owner', 'percent_complete', 'start_date', 'finish_date', 'wbs_number', 'cost', 'history', 'engineering_days')) return HttpResponse( '''{ success: true, data: %s }''' % json.dumps(j.objects[0]['fields'])) return HttpResponse( serializers.serialize('json', WorkItem.objects.filter(id=wbs_id), relations=('author', 'owner')))
def read(self, request, project_number): """ Return a list of project stages associated with projects filtered by ACL """ log.debug("GET request from user %s for stage plan list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN ret = [] for stage in project.project_stages.all(): for wbs in stage.work_items.all(): ret += wbs.engineering_days.all() return ret
def read(self, request, project_number): """ Return a list of project stages associated with projects filtered by ACL """ log.debug("GET request from user %s for stage plan list" % request.user) proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project list %s from user %s" % (project_number, request.user)) return rc.FORBIDDEN ret = [] for stage in project.project_stages.all(): for wbs in stage.work_items.all(): ret += wbs.engineering_days.all() return ret
def view_gantt_chart(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project return render_to_response('wbs/gantt.html', { 'project': project }, context_instance=RequestContext(request))
def get_resources_for_engineering_day(request, project_number, wbs_id, year, month, day, day_type, as_json=True): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project work_item = WorkItem.objects.get(id=wbs_id) requested_date = datetime.date(int(year), int(month), int(day)) ret = [ ] resources = UserProfile.objects.filter(skillset=work_item.skill_set, user__is_active=True).order_by('user__first_name') logging.debug('''Potential resources: %s.''' % resources) for res in resources: # Get the resources name if res.user.get_full_name() != '': res_full_name = res.user.get_full_name() else: res_full_name = res.user.username logging.debug('''Searching for Engineering days: work_date=%s, resource=%s, resource_id=%s''' % ( requested_date, res_full_name, res.user.id )) res_activity = EngineeringDay.objects.filter(work_date=requested_date, resource=res.user) r = {"pk": res.user.id } if len(res_activity) == 0: # Resource isn't booked at all r['resource'] = '''%s - Available all day''' % res_full_name r['available'] = True logging.debug('''%s has no Engineering Days booked.''' % res) elif len(res_activity) >= 2: # User already has 2 bookings for this day r['resource'] = '''%s - Booked out all day''' % res_full_name r['available'] = False logging.debug('''%s has 2 Engineering Days booked: %s.''' % ( res, res_activity )) else: for day in res_activity: if day.day_type == 0: r['resource'] = '''%s - Available PM only''' % res_full_name r['available'] = True logging.debug('''%s is available in PM. Booked on %s in AM.''' % ( res, day )) elif day.day_type == 1: r['resource'] = '''%s - Available AM only''' % res_full_name r['available'] = True logging.debug('''%s is available in AM. Booked on %s in PM.''' % ( res, day )) elif day.day_type == 2: r['resource'] = '''%s - Booked out all day''' % res_full_name r['available'] = False logging.debug('''%s has no availability. Booked on %s.''' % ( res, day )) try: rota = RotaItem.objects.get(person=res.user, date=requested_date) if rota.activity.unavailable_for_projects: r['resource'] = '''%s - Not Available''' % res_full_name r['available'] = False logging.debug('''%s has no availability. Rota'd on %s.''' % ( res, rota )) except RotaItem.DoesNotExist: pass ret.append(r) if as_json: return HttpResponse(json.dumps(ret)) else: return ret
def view_lessons(request, project_number): project = Project.objects.get(project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project return HttpResponse( serializers.serialize('json', project.lessons_learnt.all(), relations={'author': {'fields': ('username',), 'extras': ('get_full_name',)}}))
def read(self, request, project_number, wbs_id): """ Return a list of resources able to work on a Work item """ proj = Project.objects.get(project_number=project_number) if not check_project_read_acl(proj, request.user): log.debug("Refusing GET request for project %s from user %s" % ( project_number, request.user )) return rc.FORBIDDEN work_item = WorkItem.objects.get(id=wbs_id) requested_date = datetime.date(int(year), int(month), int(day)) ret = [ ] resources = UserProfile.objects.filter(skillset=work_item.skill_set, user__is_active=True).order_by('user__first_name') log.debug('''Potential resources: %s.''' % resources) for res in resources: # Get the resources name if res.user.get_full_name() != '': res_full_name = res.user.get_full_name() else: res_full_name = res.user.username logging.debug('''Searching for Engineering days: work_date=%s, resource=%s, resource_id=%s''' % ( requested_date, res_full_name, res.user.id )) res_activity = EngineeringDay.objects.filter(work_date=requested_date, resource=res.user) r = {"pk": res.user.id } if len(res_activity) == 0: # Resource isn't booked at all r['resource'] = '''%s - Available all day''' % res_full_name r['available'] = True logging.debug('''%s has no Engineering Days booked.''' % res) elif len(res_activity) >= 2: # User already has 2 bookings for this day r['resource'] = '''%s - Booked out all day''' % res_full_name r['available'] = False logging.debug('''%s has 2 Engineering Days booked: %s.''' % ( res, res_activity )) else: for day in res_activity: if day.day_type == 0: r['resource'] = '''%s - Available PM only''' % res_full_name r['available'] = True logging.debug('''%s is available in PM. Booked on %s in AM.''' % ( res, day )) elif day.day_type == 1: r['resource'] = '''%s - Available AM only''' % res_full_name r['available'] = True logging.debug('''%s is available in AM. Booked on %s in PM.''' % ( res, day )) elif day.day_type == 2: r['resource'] = '''%s - Booked out all day''' % res_full_name r['available'] = False logging.debug('''%s has no availability. Booked on %s.''' % ( res, day )) try: rota = RotaItem.objects.get(person=res.user, date=requested_date) if rota.activity.unavailable_for_projects: r['resource'] = '''%s - Not Available''' % res_full_name r['available'] = False logging.debug('''%s has no availability. Rota'd on %s.''' % ( res, rota )) except RotaItem.DoesNotExist: pass ret.append(r) return ret
def get_jsgantt_xml(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project #t_format = "%a %d %b %Y %H:%M:%S +0000" t_format = "%d/%m/%Y" from xml.dom.minidom import Document doc = Document() xml_project = doc.createElement("project") doc.appendChild(xml_project) for w in project.work_items.all(): task = doc.createElement("task") xml_project.appendChild(task) pID = doc.createElement("pID") pID.appendChild( doc.createTextNode(str(w.wbs_number)) ) task.appendChild(pID) pName = doc.createElement("pName") pName.appendChild( doc.createTextNode(w.title)) task.appendChild(pName) pStart = doc.createElement("pStart") pEnd = doc.createElement("pEnd") pMile = doc.createElement("pMile") if w.start_date and w.finish_date: start_date = w.start_date.strftime(t_format) finish_date = w.finish_date.strftime(t_format) mile = "0" elif w.start_date and w.duration: start_date = w.start_date.strftime(t_format) mile = "0" if project.duration_type == 0: # Hours finish_date = (w.start_date + datetime.timedelta(hours=w.duration)).strftime(t_format) elif project.duration_type == 1: # Days finish_date = (w.start_date + datetime.timedelta(days=w.duration)).strftime(t_format) elif w.finish_date and w.duration: finish_date = w.finish_date.strftime(t_format) mile = "0" if project.duration_type == 0: # Hours start_date = (w.finish_date + datetime.timedelta(hours=-w.duration)).strftime(t_format) elif project.duration_type == 1: # Days start_date = (w.finish_date + datetime.timedelta(days=-w.duration)).strftime(t_format) else: if w.start_date: start_date = w.start_date.strftime(t_format) finish_date = w.start_date.strftime(t_format) elif w.finish_date: start_date = w.finish_date.strftime(t_format) finish_date = w.finish_date.strftime(t_format) mile = "1" pStart.appendChild( doc.createTextNode(start_date)) task.appendChild(pStart) pEnd.appendChild( doc.createTextNode(finish_date)) task.appendChild(pEnd) pMile.appendChild( doc.createTextNode(mile)) task.appendChild(pMile) pRes = doc.createElement("pRes") pRes.appendChild( doc.createTextNode(w.owner.get_full_name())) task.appendChild(pRes) if w.percent_complete: pComp = doc.createElement("pComp") pComp.appendChild( doc.createTextNode(str(w.percent_complete))) task.appendChild(pComp) if w.depends: pDepend = doc.createElement("pDepend") pDepend.appendChild( doc.createTextNode(str(w.depends.wbs_number))) task.appendChild(pDepend) return HttpResponse(doc.toprettyxml(), mimetype="text/xml")
def get_msproject_xml(request, project_number): project = get_object_or_404(Project, project_number=project_number) check_project_read_acl(project, request.user) # Will return Http404 if user isn't allowed to view project from xml.dom.minidom import Document doc = Document() p = doc.createElement("Project") p.setAttribute("xmlns", "http://schemas.microsoft.com/project") name = doc.createElement("Name") name.appendChild(doc.createTextNode(project.project_name)) p.appendChild(name) company = doc.createElement("Company") company.appendChild(doc.createTextNode(project.company.company_name)) p.appendChild(company) author = doc.createElement("Author") author.appendChild(doc.createTextNode(request.user.get_full_name())) p.appendChild(author) tasks = doc.createElement("Tasks") resources = doc.createElement("Resources") existing_resources = [] ass_index = 1 assignments = doc.createElement("Assignments") first_task = project.work_items.all()[0] # We need to find the first task in # chronological order for the # start of the project last_task = project.work_items.all()[0] # and the last task errors = check_project_tasks(project) if errors: return HttpResponse(errors) # Add an all week calendar calendars = doc.createElement("Calendars") calendar = doc.createElement("Calendar") c_uid = doc.createElement("UID") c_uid.appendChild(doc.createTextNode("1")) calendar.appendChild(c_uid) c_name = doc.createElement("Name") c_name.appendChild(doc.createTextNode("Work Weekends")) calendar.appendChild(c_name) weekdays = doc.createElement("WeekDays") for day in range(0,6): weekday = doc.createElement("WeekDay") day_type = doc.createElement("DayType") day_type.appendChild(doc.createTextNode(str(day))) weekday.appendChild(day_type) day_working = doc.createElement("DayWorking") day_working.appendChild(doc.createTextNode("1")) weekday.appendChild(day_working) working_times = doc.createElement("WorkingTimes") working_time = doc.createElement("WorkingTime") from_time = doc.createElement("FromTime") from_time.appendChild(doc.createTextNode("08:00:00")) working_time.appendChild(from_time) to_time = doc.createElement("ToTime") to_time.appendChild(doc.createTextNode("18:00:00")) working_time.appendChild(to_time) working_times.appendChild(working_time) weekday.appendChild(working_times) weekdays.appendChild(weekday) calendar.appendChild(weekdays) calendars.appendChild(calendar) p.appendChild(calendars) for w in project.work_items.all(): task = doc.createElement("Task") uid = doc.createElement("UID") uid.appendChild(doc.createTextNode(str(w.wbs_number))) task.appendChild(uid) id = doc.createElement("ID") id.appendChild(doc.createTextNode(str(w.wbs_number))) task.appendChild(id) name = doc.createElement("Name") name.appendChild(doc.createTextNode(w.title)) task.appendChild(name) type = doc.createElement("Type") type.appendChild(doc.createTextNode("0")) task.appendChild(type) isnull = doc.createElement("IsNull") isnull.appendChild(doc.createTextNode("0")) task.appendChild(isnull) wbs = doc.createElement("WBS") wbs.appendChild(doc.createTextNode(str(w.wbs_number))) task.appendChild(wbs) priority = doc.createElement("Priority") priority.appendChild(doc.createTextNode("500")) task.appendChild(priority) start = doc.createElement("Start") early_start = doc.createElement("EarlyStart") late_start = doc.createElement("LateStart") finish = doc.createElement("Finish") early_finish = doc.createElement("EarlyFinish") late_finish = doc.createElement("LateFinish") duration = doc.createElement("Duration") r_duration = doc.createElement("RemainingDuration") start_t_format = "%Y-%m-%dT08:00:00" finish_t_format = "%Y-%m-%dT17:00:00" if w.start_date and w.finish_date: start_date = w.start_date.strftime(start_t_format) finish_date = w.finish_date.strftime(finish_t_format) raw_start_date = w.start_date raw_finish_date = w.finish_date elif w.start_date and w.duration: start_date = w.start_date.strftime(start_t_format) raw_start_date = w.start_date if project.duration_type == 0: # Hours finish_date = (w.start_date + datetime.timedelta(hours=w.duration)).strftime(finish_t_format) raw_finish_date = w.finish_date elif project.duration_type == 1: # Days finish_date = (w.start_date + datetime.timedelta(days=w.duration)).strftime(finish_t_format) raw_finish_date = w.finish_date elif w.finish_date and w.duration: print w, "foo" finish_date = w.finish_date.strftime(finish_t_format) raw_finish_date = w.finish_date if project.duration_type == 0: # Hours raw_start_date = (w.finish_date + datetime.timedelta(hours=-w.duration)) start_date = raw_start_date.strftime(start_t_format) elif project.duration_type == 1: # Days raw_start_date = (w.finish_date + datetime.timedelta(days=-w.duration)) start_date = raw_start_date.strftime(start_t_format) else: if w.start_date: start_date = w.start_date.strftime(start_t_format) raw_start_date = w.start_date finish_date = w.start_date.strftime(finish_t_format) raw_finish_date = w.start_date elif w.finish_date: start_date = w.finish_date.strftime(start_t_format) raw_start_date = w.finish_date finish_date = w.finish_date.strftime(finish_t_format) raw_finish_date = w.finish_date raw_duration = raw_finish_date - raw_start_date d_minutes, d_seconds = divmod(raw_duration.seconds, 60) d_hours, d_minutes = divmod(d_minutes, 60) if d_hours == 0: d_hours = 8 duration.appendChild(doc.createTextNode('''PT%sH0M0S''' % ( d_hours ))) r_duration.appendChild(doc.createTextNode('''PT%sH0M0S''' % ( d_hours ))) task.appendChild(duration) task.appendChild(r_duration) duration_format = doc.createElement("DurationFormat") duration_format.appendChild(doc.createTextNode("39")) task.appendChild(duration_format) start.appendChild( doc.createTextNode(start_date)) task.appendChild(start) early_start.appendChild( doc.createTextNode(start_date)) #task.appendChild(early_start) late_start.appendChild( doc.createTextNode(start_date)) #task.appendChild(late_start) finish.appendChild( doc.createTextNode(finish_date)) task.appendChild(finish) early_finish.appendChild( doc.createTextNode(finish_date)) #task.appendChild(early_finish) late_finish.appendChild( doc.createTextNode(finish_date)) #task.appendChild(late_finish) sv = doc.createElement("StartVariance") sv.appendChild(doc.createTextNode("0")) task.appendChild(sv) fv = doc.createElement("FinishVariance") fv.appendChild(doc.createTextNode("0")) task.appendChild(fv) f_cost_a = doc.createElement("FixedCostAccrual") f_cost_a.appendChild(doc.createTextNode("3")) task.appendChild(f_cost_a) complete = doc.createElement("PercentComplete") wbs.appendChild(doc.createTextNode(str(w.percent_complete))) task.appendChild(complete) work_complete = doc.createElement("PercentWorkComplete") wbs.appendChild(doc.createTextNode(str(w.percent_complete))) task.appendChild(work_complete) con_type = doc.createElement("ConstraintType") con_type.appendChild(doc.createTextNode("6")) task.appendChild(con_type) con_date = doc.createElement("ConstraintDate") con_date.appendChild(doc.createTextNode(finish_date)) task.appendChild(con_date) milestone = doc.createElement("Milestone") milestone.appendChild(doc.createTextNode("0")) task.appendChild(milestone) f_cost = doc.createElement("FixedCost") f_cost.appendChild(doc.createTextNode("0")) task.appendChild(f_cost) # Is this task earlier than the first task or later than the last task? if w.start_date: if w.start_date < first_task.start_date: first_task = w if w.finish_date: if w.finish_date > last_task.finish_date: last_task = w # Any dependancies? if w.depends: predecessor = doc.createElement("PredecessorLink") pre_link = doc.createElement("PredecessorUID") pre_link.appendChild(doc.createTextNode(str(w.depends.wbs_number))) predecessor.appendChild(pre_link) pre_type = doc.createElement("Type") pre_type.appendChild(doc.createTextNode("1")) predecessor.appendChild(pre_type) pre_cross = doc.createElement("CrossProject") pre_cross.appendChild(doc.createTextNode("0")) predecessor.appendChild(pre_cross) pre_linklag = doc.createElement("LinkLag") pre_linklag.appendChild(doc.createTextNode("0")) predecessor.appendChild(pre_linklag) pre_lagformat = doc.createElement("LagFormat") pre_lagformat.appendChild(doc.createTextNode("7")) predecessor.appendChild(pre_lagformat) task.appendChild(predecessor) tasks.appendChild(task) if w.owner.id not in existing_resources: resource = doc.createElement("Resource") r_uid = doc.createElement("UID") r_uid.appendChild(doc.createTextNode(str(w.owner.id))) resource.appendChild(r_uid) r_id = doc.createElement("ID") r_id.appendChild(doc.createTextNode(str(w.owner.id))) resource.appendChild(r_id) r_name = doc.createElement("Name") r_name.appendChild(doc.createTextNode(w.owner.get_full_name())) resource.appendChild(r_name) r_type = doc.createElement("Type") r_type.appendChild(doc.createTextNode("1")) resource.appendChild(r_type) r_initials = doc.createElement("Initials") r_initials.appendChild(doc.createTextNode('''%s%s''' % ( w.owner.first_name[0].upper(), w.owner.last_name[0].upper()))) resource.appendChild(r_initials) r_workgroup = doc.createElement("WorkGroup") r_workgroup.appendChild(doc.createTextNode("0")) resource.appendChild(r_workgroup) resources.appendChild(resource) existing_resources.append(w.owner.id) ass = doc.createElement("Assignment") a_uid = doc.createElement("UID") a_uid.appendChild(doc.createTextNode(str(ass_index))) ass.appendChild(a_uid) a_taskuid = doc.createElement("TaskUID") a_taskuid.appendChild(doc.createTextNode(str(w.wbs_number))) ass.appendChild(a_taskuid) a_resourceuid = doc.createElement("ResourceUID") a_resourceuid.appendChild(doc.createTextNode(str(w.owner.id))) ass.appendChild(a_resourceuid) a_start = doc.createElement("Start") a_start.appendChild(doc.createTextNode(start_date)) ass.appendChild(a_start) a_finish = doc.createElement("Finish") a_finish.appendChild(doc.createTextNode(finish_date)) ass.appendChild(a_finish) assignments.appendChild(ass) ass_index += 1 p.appendChild(tasks) p.appendChild(resources) p.appendChild(assignments) s_date = doc.createElement("StartDate") s_date.appendChild(doc.createTextNode(first_task.start_date.strftime(start_t_format))) p.appendChild(s_date) f_date = doc.createElement("FinishDate") f_date.appendChild(doc.createTextNode(last_task.finish_date.strftime(finish_t_format))) p.appendChild(f_date) doc.appendChild(p) response = http.HttpResponse(doc.toxml(), mimetype='text/xml') response['Content-Disposition'] = 'attachment;filename=%s' % '''%s_MSPROJECT_XML.xml''' % project.project_number return response