def index(): form = CustomerForm() all_customers = Customer.query.all() if form.validate_on_submit(): # Create customer customer = Customer(name=form.name.data, comment=form.comment.data) db.session.add(customer) # Commit the customer to get an id db.session.commit() # Add "Misc" Project for the new customer and commit it as well project = Project(name="Misc", customer_id=customer.id) write_history(operation=Operation.Added, model=Model.Customer, entity_id=customer.id, customer_name=customer.name, project_name=None, comment=f"Added customer '{customer.name}'") db.session.add(project) db.session.commit() flash('Customer added', 'alert alert-success alert-dismissible fade show') return redirect(url_for('customers.index')) return render_template("customers/list.html", customers=all_customers, form=form)
def done(task_id): mark_done = Task.query.get(task_id) if mark_done: # save old type state oldstate = mark_done.type # change type from task or request to info mark_done.type = Type.Info mark_done.last_change = datetime.now() # commit to db db.session.add(mark_done) db.session.commit() # write to history db table write_history(operation=Operation.Changed, model=Model.Task, entity_id=mark_done.id, customer_name=mark_done.customer_name(), project_name=mark_done.project_name(), comment=f"Marked {oldstate.name} of project '{mark_done.project_name()}' of the customer '{mark_done.customer_name()}' as done.") flash(f'{oldstate.name} marked done', 'alert alert-success alert-dismissible fade show') return redirect(request.referrer) else: return render_template('400.html'), 400
def write_new_task_to_db(form): task = build_task(form) db.session.add(task) db.session.commit() write_history(operation=Operation.Added, model=Model.Task, entity_id=task.id, customer_name=task.customer_name(), project_name=task.project_name(), comment=f"Added {task.type.name} for project '{task.project_name()}' of customer '{task.customer_name()}'") return task
def delete_from_db(task_id): task_to_shredd = Task.query.get(task_id) if task_to_shredd and task_to_shredd.deleted: db.session.delete(task_to_shredd) db.session.commit() write_history(operation=Operation.Shredded, model=Model.Task, entity_id=task_to_shredd.id, customer_name=task_to_shredd.customer_name(), project_name=task_to_shredd.project_name(), comment=f"Shredded {task_to_shredd.type.name} of project '{task_to_shredd.project_name()}' of the customer '{task_to_shredd.customer_name()}'") return(task_to_shredd) return(False)
def delete(project_id): to_delete = Project.query.get(project_id) if not to_delete or to_delete.name == "Misc": return render_template('400.html'), 400 ref = crypt_referrer(request.referrer) # build forms and fill in the crypted referrer (or "") confirm_delete = ConfirmDelete(origin=ref) cancel_delete = CancelDelete(origin=ref) # deletion was confirmed by user if confirm_delete.validate_on_submit() and confirm_delete.confirm.data: tasks = delete_project_from_db(to_delete) if tasks or tasks == 0: write_history( operation=Operation.Deleted, model=Model.Project, entity_id=to_delete.id, customer_name=to_delete.customer_name(), project_name=to_delete.name, comment= f"Deleted project '{to_delete.name}' of customer '{to_delete.customer_name()}': {tasks} tasks deleted." ) flash('Project deleted', 'alert alert-danger alert-dismissible fade show') return redirect( build_redirect_url(confirm_delete.origin.data, 'projects.index')) else: return render_template('400.html'), 400 # deletion was canceled by user elif cancel_delete.validate_on_submit() and cancel_delete.cancel.data: return redirect( build_redirect_url(confirm_delete.origin.data, 'projects.index')) tasks = Task.query.filter_by(project_id=project_id). \ filter_by(deleted=False).all() # show confirm deletion page return render_template("/projects/project.html", project=to_delete, edit_info=False, delete_confirmation=True, tasks=tasks, no_actions_in_tasktable=True, cancel_delete=cancel_delete, confirm_delete=confirm_delete)
def rename(project_id): to_rename = Project.query.get(project_id) if not to_rename: return render_template('400.html'), 400 form = RenameForm(new_name=to_rename.name, partner=to_rename.partner_id, origin=crypt_referrer(request.referrer), edit_id=to_rename.id) form.partner.choices = [(0, "None")] form.partner.choices.extend([(p.id, p.name) for p in Partner.query.all()]) if form.validate_on_submit(): to_rename.name = form.new_name.data if form.partner.data != 0: to_rename.partner_id = form.partner.data else: to_rename.partner_id = None form.partner.data = None changed = project_rename_changes(to_rename, form) if changed and len(changed) > 1: db.session.add(to_rename) db.session.commit() write_history( operation=Operation.Changed, model=Model.Project, entity_id=to_rename.id, customer_name=to_rename.customer_name(), project_name=to_rename.name, comment= f"Changed project '{to_rename.name}' of customer '{to_rename.customer_name()}': {changed}" ) flash('Project edited', 'alert alert-success alert-dismissible fade show') return redirect(build_redirect_url(form.origin.data, 'projects.index')) all_customers = Customer.query.all() projects = {} for c in all_customers: projects[c] = Project.query.filter_by(customer_id=c.id).all() return render_template('/projects/list.html', headline=f"Edit Project {to_rename.name}", projects=projects, rename_id=to_rename.id, form=form)
def edit(project_id): tasks = Task.query.filter_by(project_id=project_id). \ filter_by(deleted=False).all() project = Project.query.get(project_id) project_info_form = ProjectInfoForm(opp_number=project.opp, partner=project.partner_id, notes=project.notes) project_info_form.partner.choices = [(0, "None")] project_info_form.partner.choices.extend([(p.id, p.name) for p in Partner.query.all()]) if project_info_form.validate_on_submit(): changes = project_changes(project, project_info_form) if changes and len(changes) > 0: project.opp = project_info_form.opp_number.data if project_info_form.partner.data == 0: project.partner_id = None else: project.partner_id = project_info_form.partner.data project.notes = project_info_form.notes.data db.session.add(project) db.session.commit() write_history( operation=Operation.Changed, model=Model.Project, entity_id=project.id, customer_name=project.customer_name(), project_name=project.name, comment= f"Changed project '{project.name}' of customer '{project.customer_name()}': {changes}" ) return redirect(url_for('projects.project', project_id=project.id)) return render_template('/projects/project.html', tasks=tasks, no_actions_in_tasktable=True, project_info_form=project_info_form, project=project, edit_info=True)
def undelete(task_id): to_undelete = Task.query.get(task_id) if to_undelete: to_undelete.deleted = False to_undelete.deleted_at = None to_undelete.last_change = datetime.now() db.session.add(to_undelete) db.session.commit() write_history(operation=Operation.Undeleted, model=Model.Task, entity_id=to_undelete.id, customer_name=to_undelete.customer_name(), project_name=to_undelete.project_name(), comment=f"Undeleted {to_undelete.type.name} of project '{to_undelete.project_name()}' of customer: '{to_undelete.customer_name()}'") flash(f'{to_undelete.type.name} undeleted', 'alert alert-success alert-dismissible fade show') else: flash('No such task', 'alert alert-danger alert-dismissible fade show') return redirect(url_for('tasks.index'))
def edit(customer_id): customer_to_edit = Customer.query.get(customer_id) if not customer_to_edit: flash('Editing customer failed: No such customer', 'alert alert-danger alert-dismissible fade show') return redirect(url_for('customers.index')) form = CustomerForm(name=customer_to_edit.name, comment=customer_to_edit.comment, edit_id=customer_to_edit.id) form.submit.label.text = "Save" if form.validate_on_submit(): changes = customer_changes(customer_to_edit, form) if changes: customer_to_edit.name = form.name.data customer_to_edit.comment = form.comment.data write_history( operation=Operation.Changed, model=Model.Customer, entity_id=customer_to_edit.id, customer_name=customer_to_edit.name, project_name=None, comment=f"Changed customer '{customer_to_edit.name}': {changes}" ) db.session.add(customer_to_edit) db.session.commit() flash('Customer saved', 'alert alert-success alert-dismissible fade show') return redirect(url_for('customers.index')) else: customers = Customer.query.all() return render_template('/customers/edit.html', form=form, edit_id=customer_to_edit.id, customers=customers)
def delete(task_id): to_delete = Task.query.get(task_id) if to_delete: to_delete.deleted = True to_delete.deleted_at = datetime.now() to_delete.last_change = datetime.now() db.session.add(to_delete) db.session.commit() write_history(operation=Operation.Deleted, model=Model.Task, entity_id=to_delete.id, customer_name=to_delete.customer_name(), project_name=to_delete.project_name(), comment=f"Deleted {to_delete.type.name} of project '{to_delete.project_name()}' of the customer '{to_delete.customer_name()}'.") flash(f'{to_delete.type.name} deleted', 'alert alert-warning alert-dismissible fade show') else: flash('No such task', 'alert alert-danger alert-dismissible fade show') return redirect(request.referrer)
def index(): form = PartnerForm() all_partners = Partner.query.all() if form.validate_on_submit(): partner = Partner(name=form.name.data, comment=form.comment.data) db.session.add(partner) db.session.commit() write_history(operation=Operation.Added, model=Model.Partner, entity_id=partner.id, customer_name=None, project_name=None, comment=f"Added partner '{partner.name}'") return redirect(url_for('partners.index')) return render_template("/partners/list.html", partners=all_partners, form=form)
def delete(partner_id): to_delete = Partner.query.get(partner_id) if not to_delete: return render_template('400.html'), 400 if to_delete.projects.count() == 0: db.session.delete(to_delete) db.session.commit() write_history(operation=Operation.Deleted, model=Model.Partner, entity_id=to_delete.id, customer_name=None, project_name=None, comment=f"Deleted partner '{to_delete.name}'") flash('partner deleted', 'alert alert-warning alert-dismissible fade show') else: flash('This partners has assigned projects', 'alert alert-danger alert-dismissible fade show') return redirect(url_for('partners.index'))
def project(project_id): tasks = Task.query.filter_by(project_id=project_id). \ filter_by(deleted=False).all() project = Project.query.get(project_id) form = TaskForm(customer=project.customer_id, project=project.id) form.customer.choices = [(c.id, c.name) for c in Customer.query.all()] form.type.choices = [(t.value, t.name) for t in Type] form.weekly.choices = [(w.value, w.name) for w in Weekly] form.project.choices = [(p.id, p.name) for p in Project.query.all()] if form.validate_on_submit(): task = build_task(form) db.session.add(task) db.session.commit() write_history( operation=Operation.Added, model=Model.Task, entity_id=task.id, customer_name=task.customer_name(), project_name=task.project_name(), comment= f"Added {task.type.name} for project '{task.project_name()}' of customer '{task.customer_name()}'" ) flash(f'{task.type.name} added', 'alert alert-success alert-dismissible fade show') return redirect(url_for('projects.project', project_id=project_id)) return render_template('/projects/project.html', tasks=tasks, form=form, project=project, edit_info=False)
def edit(partner_id): to_edit = Partner.query.get(partner_id) if not to_edit: return render_template('400.html'), 400 form = PartnerForm(name=to_edit.name, comment=to_edit.comment, edit_id=to_edit.id) if form.validate_on_submit(): changes = partner_changes(to_edit, form) if changes: to_edit.name = form.name.data to_edit.comment = form.comment.data db.session.add(to_edit) db.session.commit() write_history( operation=Operation.Changed, model=Model.Partner, entity_id=to_edit.id, customer_name=None, project_name=None, comment=f"Changed partner '{to_edit.name}': {changes}") flash('Partner edited', 'alert alert-success alert-dismissible fade show') return redirect(url_for('partners.index')) partners = Partner.query.all() return render_template("/partners/list.html", edit_id=to_edit.id, form=form, partners=partners)
def edit(task_id): # get the task object for editing from the db to_edit = Task.query.get(task_id) # if no task was found, flash an error and redirect to the tasks list if not to_edit: flash('Editing request failed: No such task', 'alert alert-danger alert-dismissible fade show') return redirect(url_for('tasks.index')) # for security reasons, lets encrypt the referer that we will add as # hidden field into the form. prevents client side manipulation attempts. crypted_referrer = crypter.encrypt(request.referrer.encode()) # build the form and use the task values as the forms default values form = TaskForm(customer=to_edit.customer_id(), text=to_edit.text, project=to_edit.project_id, type=to_edit.type.value, duedate=to_edit.duedate, weekly=to_edit.weekly.value, referrer=crypted_referrer.decode()) # and add the valid options for the form form.customer.choices = [(c.id, c.name) for c in Customer.query.all()] form.type.choices = [(b.value, b.name) for b in Type] form.weekly.choices = [(w.value, w.name) for w in Weekly] form.project.choices = [(p.id, p.name) for p in Project.query.all()] form.submit.label.text = "Save" if form.validate_on_submit(): if form.duedate.data: duedate = date.fromisoformat(form.duedate.data) else: duedate = None # gets back None if nothing changed, else returnes TaskChange[] (Enum) changed_items = task_changed(to_edit, form, duedate) if changed_items and len(changed_items) > 1: to_edit.text = form.text.data to_edit.project_id = form.project.data to_edit.type = Type(form.type.data) to_edit.duedate = duedate to_edit.weekly = Weekly(form.weekly.data) to_edit.last_change = datetime.now() db.session.add(to_edit) db.session.commit() write_history(operation=Operation.Changed, model=Model.Task, entity_id=to_edit.id, customer_name=to_edit.customer_name(), project_name=to_edit.project_name(), comment=f"Modified {to_edit.type.name} of project '{to_edit.project_name()}' of customer: '{to_edit.customer_name()}': {changed_items}changed.") flash(f'{to_edit.type.name} saved', 'alert alert-success alert-dismissible fade show') return redirect(crypter.decrypt(form.referrer.data.encode()).decode()) else: # lets get the referrer ref = request.referrer # and prepare an empty tasks object tasks = None # next, we match the referer against valid options and build the tasks query accordingly # Valid options for referrer: # tasks : http://<HOST_or_IP>/tasks/ # open tasks : http://<HOST_or_IP>/tasks/open # project : http://<HOST_or_IP>/projects/<project_id> if re.search("^https?://(.+)/tasks/$", ref): tasks = Task.query.filter_by(deleted=False) elif re.search("^https?://(.+)/tasks/open$", ref): tasks = Task.query.filter_by(deleted=False). \ filter(not_(Task.type.like(Type.Info))) else: match = re.search("^https?://(.+)/projects/(\d+)$", ref) if match: tasks = Task.query.filter_by(project_id=match.group(2)). \ filter_by(deleted=False) # if tasks is still None, no regex matched, something was wrong with the referrer. if not tasks: return render_template('400.html'), 400 return render_template('/tasks/edit.html', form=form, tasks=tasks, edit_id=to_edit.id, headline="Edit Task")