Exemplo n.º 1
0
def project_components(project_id):
  from models.project import Project, Component
  
  project_id = urllib.unquote_plus(project_id)
  project = Project.query.filter_by(id=project_id).first()
  if not project:
    abort(404)
  elif not app.access('project', action='update', project=project):
    abort(403)
  
  title = g._t('project components')
  
  breadcrumbs = (
    (g._t('projects'), url_for('project_index')),
    (project.__str__(), url_for('project_view', project_id=urllib.quote_plus(str(project_id)))),
    (title, "#")
  )
  
  if (request.form.get('method') == 'PUT' or request.method == 'PUT') and request.form.get('csrf_token'):
    submittedComponent = Component.query.filter_by(id=request.form.get('component_id')).first()
    if submittedComponent:
      submittedComponent.alias = request.form.get('component_alias', '')
      submittedComponent.title = request.form.get('component_title', '')
      submittedComponent.info = request.form.get('component_info', '')
    
      if not submittedComponent.validate():
        submittedComponent.save()
        
        flash( g._t('component update success'))
        return redirect(url_for('project_components', project_id=urllib.quote_plus(str(project_id))))
    else:
      flash( g._t('component not found'), 'error')
    
  elif (request.form.get('method') == 'DELETE' or request.method == 'DELETE') and request.form.get('csrf_token'):
    submittedComponent = Component.query.filter_by(id=request.form.get('component_id')).first()
    if submittedComponent:
      submittedComponent.delete()
    
      flash( g._t('component delete success'))
      return redirect(url_for('project_components', project_id=urllib.quote_plus(str(project_id))))
    else:
      flash( g._t('component not found'), 'error')
    
  elif (request.form.get('method') == 'POST' or request.method == 'POST') and request.form.get('csrf_token'):
    submittedComponent = Component()
    submittedComponent.project_id = project.id
    submittedComponent.alias = request.form.get('component_alias', '')
    submittedComponent.title = request.form.get('component_title', '')
    submittedComponent.info = request.form.get('component_info', '')
    
    if not submittedComponent.validate():
      submittedComponent.save()
      
      flash( g._t('component create success'))
      return redirect(url_for('project_components', project_id=urllib.quote_plus(str(project_id))))
    
  else:
    submittedComponent = Component()
  
  return render_template('project/components.html', project_id=project_id, project=project, submittedComponent=submittedComponent, title=title, breadcrumbs=breadcrumbs)
Exemplo n.º 2
0
 def listActiveReports(cls, start_date=None, end_date=None, accounts=None, components=None):
   from models.account import Account
   from models.project import Project, Component
   from models.report import Report
   
   query = Report.query\
     .filter(~Report.status.in_(Report._r(Report.STATUS_DELETED)))\
     .join(Report.account)\
     .filter(~Account.status.in_(Account._r(Account.STATUS_DELETED)))\
     .join(Report.component, aliased=True)\
     .filter(~Component.status.in_(Component._r(Component.STATUS_DELETED)))\
     .join(Report.project, aliased=True)\
     .filter(~Project.status.in_(Project._r(Project.STATUS_DELETED)))
   
   if start_date:
     query = query.filter(Report.due_date>=start_date)
   if end_date:
     query = query.filter(Report.due_date<=end_date)
   if accounts:
     query = query.filter(Report.account_id.in_(accounts))
   if components:
     query = query.filter(Report.component_id.in_(components))
   
   query = query.order_by(Account.first_name, Account.last_name, Account.alias, Report.due_date, Report.created)
   
   return query.all()
Exemplo n.º 3
0
 def listActiveComponents(cls, project):
   from models.project import Project, Component
   
   project = cls.__parseProjectArgument(project)
   
   return Component.query\
     .filter(Component.project_id==project.id, ~Component.status.in_(Component._r(Component.STATUS_DELETED)))\
     .order_by(Component.alias)\
     .all()
Exemplo n.º 4
0
 def listAllActiveComponents(cls):
   from models.project import Project, Component, Label
   
   return Component.query\
     .join(Component.project)\
     .join(Project.labels)\
     .join(Project.members, aliased=True)\
     .filter(~Component.status.in_(Component._r(Component.STATUS_DELETED)))\
     .filter(~Project.status.in_(Project._r(Project.STATUS_DELETED)))\
     .order_by(Label.title, Project.alias, Component.alias)\
     .all()
Exemplo n.º 5
0
def install_migration_projects():
  """Migrate the projects data from the old CouchDB storage"""
  from models.account import Account
  from models.project import Project, Component, Label, Role
  
  for row in __couchdb().view('_design/projects/_view/list'):
    value = row['value']
    
    value['_id'] = value.get('_id', '').replace(':', '/')
    
    # resolve the labels INT or EXT
    value['labels'] = []
    if value.get('_id', '').startswith('INT'):
      value['labels'].append(Label.LABEL_INTERNAL)
    elif value.get('_id', '').startswith('EXT'):
      value['labels'].append(Label.LABEL_EXTERNAL)
    elif value.get('_id', '').startswith('MGM') or value.get('_id', '').startswith('OUT'):
      value['labels'].append(Label.LABEL_VACATION)
    elif value.get('_id', '') == 'NOKIA/OFFICIAL':
      value['labels'].append(Label.LABEL_VACATION)
    
    value['_id'] = value.get('_id', '').replace('EXT/', '').replace('INT/', '')
    project = Project.query.filter_by(alias=value.get('_id', '')).first()
    if not project:
      project = Project()
      project.alias = value.get('_id', '')
      project.title = value.get('title')
      project.info = value.get('description')
      if value.get('deleted', False):
        project.status = Project.STATUS_ACTIVE | Project.STATUS_DELETED
      project.save()
      print '[MIGRATION:PROJECT]', project.__str__()
    
    items = [(None, value.get('title'))]
    for k,v in value.get('partitions', {}).items():
      treeRecursion(k, v, None, items)
    
    for component_alias, component_title in items:
      if not component_alias:
        continue
      component = Component.query.filter_by(project=project, alias=component_alias).first()
      if not component:
        component = Component()
        component.alias = component_alias
        component.title = component_title
        component.project = project
        component.save()
        print '[MIGRATION:COMPONENT]', project.__str__(), component.__str__()
    
    for labelItem in value.get('labels', []):
      label = Label.query.filter_by(title=labelItem, project=project).first()
      if not label:
        label = Label()
        label.title = labelItem
        label.project = project
        label.save()
Exemplo n.º 6
0
 def listAllComponentsForActiveMember(cls, account):
   from models.project import Project, Component, Membership
   
   account = cls.__parseAccountArgument(account)
   
   return Component.query\
     .filter(~Component.status.in_(Component._r(Component.STATUS_DELETED)))\
     .join(Component.project)\
     .filter(~Project.status.in_(Project._r(Project.STATUS_DELETED)))\
     .join(Project.members, aliased=True)\
     .filter(Membership.account==account, ~Membership.status.in_(Membership._r(Membership.STATUS_DELETED)))\
     .order_by(Project.alias, Component.alias)\
     .all() + cls.listGeneralComponents()
Exemplo n.º 7
0
def install_project_data():
  """Create all the required projects if not defined"""
  from application import db
  from models.project import Project, Component, Label
  
  projectList = [
    {
      'alias': 'MGM',
      'title': 'Management records',
      'info': None,
      'components': [
        {
          'alias': 'VAC',
          'title': 'Vacation',
          'info': None
        },
        {
          'alias': 'VAC/KZOT',
          'title': 'Vacation. Days off by KZoT',
          'info': None
        },
        {
          'alias': 'VAC/NP',
          'title': 'Vacation. Unpaid Leave',
          'info': None
        },
        {
          'alias': 'VAC/EDU',
          'title': 'Vacation. Education',
          'info': None
        }
      ],
      'labels': [Label.LABEL_GENERAL, Label.LABEL_VACATION]
    },
    {
      'alias': 'OUT',
      'title': 'N/A Time',
      'info': """Hours sink for time that an employee was available in XMPP but was neither doing work or in stand-by""",
      'components': [],
      'labels': [Label.LABEL_GENERAL, Label.LABEL_VACATION]
    },
    {
      'alias': 'EDU',
      'title': 'Self Education',
      'info': """Self Education. Report summary is obligatory!""",
      'components': [],
      'labels': [Label.LABEL_GENERAL, Label.LABEL_INTERNAL]
    },
    {
      'alias': 'IDLE',
      'title': 'Idle Time',
      'info': """Hours sink for time that an employee is online and available but doesn't have a specific task""",
      'components': [],
      'labels': [Label.LABEL_GENERAL, Label.LABEL_INTERNAL]
    },
    {
      'alias': 'PP',
      'title': 'P-Product internal tasks',
      'info': None,
      'components': [],
      'labels': [Label.LABEL_GENERAL, Label.LABEL_INTERNAL]
    },
    {
      'alias': 'OFFICE',
      'title': 'Office Tasks',
      'info': """Shopping for Office, Psychotherapy, Interviews, etc.""",
      'components': [],
      'labels': [Label.LABEL_INTERNAL]
    }
  ]
  
  for projectItem in projectList:
    project = Project.query.filter_by(alias=projectItem['alias']).first()
    if not project:
      project = Project()
      project.alias = projectItem['alias']
      project.title = projectItem['title']
      project.info = projectItem['info']
      project.save()
  
      for componentItem in projectItem['components']:
        component = Component.query.filter_by(alias=componentItem['alias'], project=project).first()
        if not component:
          component = Component()
          component.alias = componentItem['alias']
          component.title = componentItem['title']
          component.info = componentItem['info']
          component.project = project
          component.save()
      
      for labelItem in projectItem['labels']:
        label = Label.query.filter_by(title=labelItem, project=project).first()
        if not label:
          label = Label()
          label.title = labelItem
          label.project = project
          label.save()