def install_migration_reports(): """Migrate the reports data from the old CouchDB storage""" from models.account import Account from models.project import Project, Component from models.report import Report import datetime fault = open('data/fault.log', 'w') for row in __couchdb().view('_design/reports/_view/list_by_date', startkey=['2013-01-01'], endkey=['2014-12-12']): try: value = row['value'] value['project'] = value.get('project', '').replace(':', '/').replace('EXT/', '').replace('INT/', '') report = Report() report.due_date = value.get('due_date') if value.get('reporter', ''): report.reporter = Account.query.filter_by(alias=value.get('reporter', '')).first() if value.get('project', ''): report.project = Project.query.filter_by(alias=value.get('project', '')).first() if value.get('partition', []): component_alias = '/'.join(partition.keys()[0] for partition in value.get('partition', [])) else: component_alias = Component.COMPONENT_DEFAULT report.component = Component.query.filter_by(project=report.project, alias=component_alias).first() or Component.query.filter_by(project=project, alias=Component.COMPONENT_DEFAULT).first() report.duration = float(value.get('hours', 0)) report.summary = value.get('summary', '') if value.get('employee', ''): report.account = Account.query.filter_by(alias=value.get('employee', '')).first() if value.get('deleted', False): report.status = Report.STATUS_ACTIVE | Report.STATUS_DELETED report.save() print '[MIGRATION:REPORT]', report.__str__() except Exception as e: message = datetime.datetime.now().__str__().split('.')[0] + '\n\t' + str(e) print message fault.write(message) fault.close()
def report_edit(account_id, report_id=None): from models.account import Account from models.project import Project, Component from models.report import Report account = Account.query.filter_by(id=account_id).first() if not account: if request.is_ajax: return Response(json.dumps({'status':404, 'description':'Not found', 'errors':['user not found']}), mimetype='application/json') else: abort(404) report = None if not report_id: report = Report() report.status = Report.STATUS_ACTIVE report.due_date = datetime.datetime.now().strftime('%Y-%m-%d') if not app.access('report', action='create'): if request.is_ajax: return Response(json.dumps({'status':403, 'description':'Forbidden', 'errors':['forbidden']}), mimetype='application/json') else: abort(403) else: report_id = urllib.unquote_plus(report_id) report = Report.query.filter_by(id=report_id).first() if not report: if request.is_ajax: return Response(json.dumps({'status':404, 'description':'Not found', 'errors':['report not found']}), mimetype='application/json') else: abort(404) elif not app.access('report', action='update', report=report): if request.is_ajax: return Response(json.dumps({'status':403, 'description':'Forbidden', 'errors':['forbidden']}), mimetype='application/json') else: abort(403) title = g._t('report submit') report_due_date_list = [] validationErrors = [] if (request.method == 'POST' and request.values.get('csrf_token', None)) or request.values.get('no_validate', None): report.reporter_id = g.account.id component_id = request.values.get('report_component_id', None) if component_id: component = Component.query.filter_by(id=component_id).first() if component: report.component_id = component.id report.project_id = component.project_id report_due_date_list = request.values.get('report_due_date', report.due_date).strip().split(',') report.due_date = report_due_date_list.pop(0) hours = request.values.get('report_hours', str(report.hours)).strip() or 0 if not hours or not str(hours).isdigit(): hours = 0.0 minutes = request.values.get('report_minutes', str(report.minutes)).strip() or 0 if not minutes or not str(minutes).isdigit(): minutes = 0.0 report.duration = float(hours) + (float(minutes) / 60) report.summary = request.values.get('report_summary', report.summary).strip() report.status = int(request.form.get('report_status', report.status).strip()) report.account_id = account.id validationErrors = report.validate() if request.values.get('no_validate', None): status = 200 description = 'OK' elif not validationErrors: report.save() for report_clone_due_date in report_due_date_list: if report_clone_due_date == report.due_date: continue reportClone = Report() reportClone.reporter_id = report.reporter_id reportClone.project_id = report.project_id reportClone.component_id = report.component_id reportClone.summary = report.summary reportClone.status = report.status reportClone.duration = report.duration reportClone.account_id = report.account_id reportClone.due_date = report_clone_due_date reportCloneValidationErrors = reportClone.validate() if not reportCloneValidationErrors: reportClone.save() print 'reportClone: saved' status = 200 description = 'OK' if request.is_ajax: return Response(json.dumps({ 'html':render_template('_popup.html', title=g._t( 'report submit success' ), message=g._t( 'report submit success message' ), javascript="""setTimeout(function(){$('form[name=statistics-form]').submit(); $('form[name=filter-form]').submit();}, 300);"""), 'status':status, 'description':description, 'errors':validationErrors }), mimetype='application/json') else: flash( g._t( 'report submit success' ) ) return redirect( url_for( 'report_index', account_id=account_id ) ) else: status = 400 description = 'Bad request' else: status = 200 description = 'OK' validationErrors = [] if report.due_date: report_due_date_list.insert(0, report.due_date) report.due_date = ','.join(report_due_date_list) """ If the report exists, but the account is no longer a member of the project, we avoid an ability to change the project by keeping the only project option available """ header = _activityHeader(employees=[account]) projectList = header['projects'] if report.id and report.component and not report.component in projectList: projectList = [report.component] if request.is_ajax: htmlContent = render_template('report/report.edit-popup.html', account=account, title=title, report=report, errors=validationErrors, projectList=projectList) return Response(json.dumps({'html':htmlContent, 'status':status, 'description':description, 'errors':validationErrors}), mimetype='application/json') else: htmlContent = render_template('report/report.edit.html', account=account, title=title, report=report, errors=validationErrors, projectList=projectList) return htmlContent