Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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'))
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
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)
Пример #12
0
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'))
Пример #13
0
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)
Пример #14
0
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)
Пример #15
0
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")