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)
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()
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()
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()
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()
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()
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()