예제 #1
0
def view_home(request):
    """
    Default home view
    """
    fanstatic_resources.dashboard_home.need()

    session = DBSession()
    user = request.authenticated_user
    projects = session.query(Project)

    active_projects = set(projects.filter(Project.active))

    my_projects = projects\
                  .filter(Project.users_favorite(user))\
                  .order_by(Project.customer_id).all()

    my_projects = request.filter_viewables(my_projects)
    other_active_projects = sorted(request.filter_viewables(active_projects.difference(my_projects)), key=unicodelower)

    boards = [
            {
                'title': 'Favorite projects',
                'custprojs': group_by_customer(my_projects),
            }
        ]

    listings = []

    max_board_projects = 20

    if not len(my_projects) and len(other_active_projects) < max_board_projects:
        boards.append({
                        'title': 'Active projects',
                        'custprojs': group_by_customer(other_active_projects),
                    })
    else:
        listing_columns = 4
        listings.append({
                        'title': 'Active projects',
                        'projgroups': tuple(chunks(tuple(other_active_projects), listing_columns)),
                    })

    return {
        'boards': boards,
        'listings': listings,
        'render_application_icon': render_application_icon,
        'get_application_link': get_application_link,
        }
예제 #2
0
    def handle_save(self, form, appstruct):
        """ The main handle method for the wizard. """
        customer = self.context.get_instance()

        # create new users
        recipients = []
        groups = {}
        mailer = get_mailer(self.request)
        for newuser in appstruct['new_users']:
            user = User(fullname=newuser['fullname'], email=newuser['email'])
            if not newuser['role'] in groups:
                groups[newuser['role']] = []
            groups[newuser['role']].append(user)
            if newuser['send_email_howto']:
                recipients.append(newuser['email'])
        for recipient in recipients:
            headers = {"header": u'Welcome to Penelope',
            "message": ('You were enabled as a user of Penelope, '
                        'our online projects and trouble ticket '
                        'management platform. Your username is <strong>%s</strong>. '
                        'With penelope you will be '
                        'able to open new tickets and follow the evolution '
                        'of the issues you opened. We recommend to double '
                        'check that the tickets you open have the '
                        '"Ticked opened by customer" field set at "SI" (Yes).' % recipient),
            "link": '%s/password_reset_form' % (self.request.application_url),
            "action": 'Activate your account NOW!'}
            message = Message(subject=WELCOME_SUBJECT,
                                recipients=[recipient],
                                body='Welcome to Penelope',
                                extra_headers={'X-MC-Template': 'general',
                                               'X-MC-MergeVars': json.dumps(headers)})
            mailer.send(message)

        #create project and set manager
        manager = self.request.authenticated_user
        project = Project(name=appstruct['project']['project_name'],
                          manager=manager)

        #set groups
        for g in appstruct['users']:
            if not g['role'] in groups:
                groups[g['role']] = []
            for u in g['usernames']:
                user = DBSession.query(User).get(u)
                groups[g['role']].append(user)

        for rolename, users in groups.items():
            role = DBSession.query(Role).filter(Role.name == rolename).one()
            group = Group(roles=[role, ], users=users)
            project.add_group(group)

        #create contract with cr
        crs = appstruct['contracts']['customer_requests']
        co =  appstruct['contracts']['contract']
        contract = Contract(**co)
        contract.project_id = project.id

        #create CR
        tickets = []
        for cr in crs:
            customer_request = CustomerRequest(name=cr['title'])
            person_types = {
                'junior': 'Junior',
                'senior': 'Senior',
                'graphic': 'Graphic',
                'pm': 'Project manager',
                'architect': 'Architect',
                'tester': 'Tester'
            }
            for key, value in person_types.items():
                if cr[key]:
                    Estimation(person_type=value,
                            days=cr[key],
                            customer_request=customer_request)
            project.add_customer_request(customer_request)
            customer_request.contract = contract
            if not cr['ticket']:
                continue
            tickets += [{'summary': cr['title'],
                        'customerrequest': customer_request,
                        'reporter': manager.email,
                        'type': 'task',
                        'priority': 'major',
                        'milestone': 'Backlog',
                        'owner': manager.email}]

        #create project management CR and tickets
        project_management_cr = CustomerRequest(name="Project management")
        project_management_cr.contract = contract
        project.add_customer_request(project_management_cr)
        project_management_tickets = PM_TICKETS
        for summary, description in project_management_tickets.items():
          tickets += [{ 'summary': summary,
                        'description': description,
                        'customerrequest': project_management_cr,
                        'reporter': manager.email,
                        'type': 'task',
                        'priority': 'major',
                        'sensitive': '1',
                        'milestone': 'Backlog',
                        'owner': manager.email}]

        #create google docs/folders
        for app_definition in appstruct['google_docs']:
            app = GoogleDoc(name=app_definition['name'],
                            api_uri=app_definition['uri'])
            if app_definition['share_with_customer']:
                acl = ApplicationACL(role_id='customer',
                                     permission_name='view')
                acl.project = app
            project.add_application(app)

        #create trac
        trac = Trac(name="Trac for %s" % appstruct['project']['project_name'])
        trac.settings = self.request.registry.settings # an ugly patch to pass 
                                                       # the missing settings 
        trac.milestones = appstruct['milestones']
        trac.tickets = tickets
        if appstruct['project']['trac_name']:
            trac.project_name = appstruct['project']['trac_name']
        else:
            trac.project_name = appstruct['project']['project_name']
        project.add_application(trac)

        customer.add_project(project)
        raise exc.HTTPFound(location=self.request.fa_url('Customer',
                                                         customer.id))