Ejemplo n.º 1
0
def release(ticket_id=False):
    if ticket_id:

        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        # is ticket assigned.
        if not ticket.assigned:
            flash('Ticket has not been assigned')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

        # check ticket is owned by user or user is admin
        if (ticket.assigned.id != g.user.id) and (not g.user.is_admin):
            flash('You can not release a ticket you are not working on.')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

        # set status to open
        status = FlicketStatus.query.filter_by(status='Open').first()
        ticket.current_status = status
        ticket.assigned = None
        db.session.commit()

        # add action record
        add_action(action='release', ticket=ticket)

        # send email to state ticket has been released.
        f_mail = FlicketMail()
        f_mail.release_ticket(ticket)

        flash('You released ticket: {}'.format(ticket.id))
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    return redirect(url_for('flicket_bp.tickets'))
Ejemplo n.º 2
0
def ticket_claim(ticket_id=False):
    if ticket_id:
        # claim ticket
        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        if ticket.assigned == g.user:
            flash(gettext('You have already been assigned this ticket.'),
                  category='success')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

        # set status to in work
        status = FlicketStatus.query.filter_by(status='In Work').first()
        ticket.assigned = g.user
        g.user.total_assigned += 1
        ticket.current_status = status
        ticket.last_updated = datetime.datetime.now()
        db.session.commit()

        # add action record
        add_action(ticket, 'claim')

        # send email notifications
        f_mail = FlicketMail()
        f_mail.assign_ticket(ticket=ticket)

        flash(gettext('You claimed ticket: %(value)s', value=ticket.id))
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    return redirect(url_for('flicket_bp.tickets'))
Ejemplo n.º 3
0
def unsubscribe_ticket(ticket_id=None, user_id=None):

    if ticket_id and user_id:

        ticket = FlicketTicket.query.filter_by(id=ticket_id).one()
        user = FlicketUser.query.filter_by(id=user_id).one()

        if ticket.can_unsubscribe(user):
            subscription = FlicketSubscription.query.filter_by(
                user=user, ticket=ticket).one()
            # unsubscribe user to ticket
            ticket.last_updated = datetime.datetime.now()
            add_action(ticket, 'unsubscribe', recipient=user)
            db.session.delete(subscription)
            db.session.commit()
            flash(gettext(
                '"{}" has been unsubscribed from this ticket.'.format(
                    user.name)),
                  category='success')

        else:

            flash(gettext('Could not unsubscribe "{}" from ticket.'.format(
                user.name)),
                  category='warning')

        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))
Ejemplo n.º 4
0
def ticket_department_category(ticket_id=False):
    if not app.config['change_category']:
        abort(404)

    if app.config['change_category_only_admin_or_super_user']:
        if not g.user.is_admin and not g.user.is_super_user:
            abort(404)

    form = ChangeDepartmentCategoryForm()
    ticket = FlicketTicket.query.get_or_404(ticket_id)

    if ticket.current_status.status == 'Closed':
        flash(
            gettext(
                "Can't change the department and category on a closed ticket.")
        )
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    if form.validate_on_submit():
        department_category = FlicketDepartmentCategory.query.filter_by(
            department_category=form.department_category.data).one()

        if ticket.category_id == department_category.category_id:
            flash(gettext(
                f'Category "{ticket.category.category} / {ticket.category.department.department}" '
                'is already assigned to ticket.'),
                  category='warning')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

        # change category
        ticket.category_id = department_category.category_id

        # add action record
        add_action(ticket,
                   'department_category',
                   data={
                       'department_category':
                       department_category.department_category,
                       'category_id': department_category.category_id,
                       'category': department_category.category,
                       'department_id': department_category.department_id,
                       'department': department_category.department
                   })

        db.session.commit()

        flash(gettext(f'You changed category of ticket: {ticket_id}'),
              category='success')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    title = gettext('Change Department / Category of Ticket')

    return render_template("flicket_department_category.html",
                           title=title,
                           form=form,
                           ticket=ticket)
Ejemplo n.º 5
0
def ticket_assign(ticket_id=False):
    form = AssignUserForm()
    ticket = FlicketTicket.query.filter_by(id=ticket_id).one()

    if ticket.current_status.status == 'Closed':
        flash(gettext("Can't assign a closed ticket."), category='warning')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    if form.validate_on_submit():

        user = FlicketUser.query.filter_by(username=form.username.data).first()

        if ticket.assigned == user:
            flash(gettext('User is already assigned to ticket.'),
                  category='warning')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

        # set status to in work
        status = FlicketStatus.query.filter_by(status='In Work').first()
        # assign ticket
        ticket.assigned = user
        ticket.current_status = status
        ticket.last_updated = datetime.datetime.now()

        if not user.total_assigned:
            user.total_assigned = 1
        else:
            user.total_assigned += 1

        # add action record
        add_action(ticket, 'assign', recipient=user)

        # subscribe to the ticket
        if not ticket.is_subscribed(user):
            subscribe = FlicketSubscription(ticket=ticket, user=user)
            db.session.add(subscribe)

        db.session.commit()

        # send email to state ticket has been assigned.
        f_mail = FlicketMail()
        f_mail.assign_ticket(ticket)

        flash(gettext('You reassigned ticket: {} to {}'.format(
            ticket.id, user.name)),
              category='success')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    title = gettext('Assign Ticket')

    return render_template("flicket_assign.html",
                           title=title,
                           form=form,
                           ticket=ticket)
Ejemplo n.º 6
0
def subscribe_user(ticket, user):
    if not ticket.is_subscribed(user):
        # subscribe user to ticket
        # noinspection PyArgumentList
        subscribe = FlicketSubscription(user=user, ticket=ticket)
        add_action(ticket, 'subscribe', recipient=user)
        db.session.add(subscribe)
        db.session.commit()
        return True

    return False
Ejemplo n.º 7
0
def ticket_institute(ticket_id=False):
    if not app.config["change_institute"]:
        abort(404)

    if app.config["change_institute_only_admin_or_super_user"]:
        if not g.user.is_admin and not g.user.is_super_user:
            abort(404)

    form = InstituteForm()
    ticket = FlicketTicket.query.get_or_404(ticket_id)

    if ticket.current_status.status == "Closed":
        flash(gettext("Can't change the institute on a closed ticket."))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    if form.validate_on_submit():
        institute = FlicketInstitute.query.filter_by(
            institute=form.institute.data
        ).one()

        if ticket.institute_id == institute.institute_id:
            flash(
                gettext(
                    f"Institute {ticket.institute.institute} is already assigned to ticket."
                ),
                category="warning",
            )
            return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

        # change institute
        ticket.institute_id = institute.institute_id

        # add action record
        add_action(
            ticket,
            "institute",
            data={
                "institute": institute.institute,
                "institute_id": institute.institute_id,
            },
        )

        db.session.commit()

        flash(
            gettext(f"You changed institute of ticket: {ticket_id}"), category="success"
        )
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    title = gettext("Change Institute of Ticket")

    return render_template(
        "flicket_institute.html", title=title, form=form, ticket=ticket
    )
Ejemplo n.º 8
0
def ticket_assign(ticket_id=False):
    form = AssignUserForm()
    ticket = FlicketTicket.query.filter_by(id=ticket_id).one()

    if ticket.current_status.status == "Closed":
        flash(gettext("Can't assign a closed ticket."))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    if form.validate_on_submit():

        user = FlicketUser.query.filter_by(username=form.username.data).first()

        if ticket.assigned == user:
            flash(gettext("User is already assigned to ticket."))
            return redirect(
                url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

        # assign ticket
        ticket.assigned = user
        ticket.current_status = FlicketStatus.query.filter_by(id=1).first()

        if not user.total_assigned:
            user.total_assigned = 1
        else:
            user.total_assigned += 1

        # add action record
        add_action(ticket, "assign", recipient=user)

        # subscribe to the ticket
        if not ticket.is_subscribed(user):
            subscribe = FlicketSubscription(ticket=ticket, user=user)
            db.session.add(subscribe)

        db.session.commit()

        # send email to state ticket has been assigned.
        f_mail = FlicketMail()
        f_mail.assign_ticket(ticket)

        flash(gettext(f"You reassigned ticket: {ticket.id}s to {user.name}"))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    title = gettext("Assign Ticket")

    return render_template("flicket_assign.html",
                           title=title,
                           form=form,
                           ticket=ticket)
Ejemplo n.º 9
0
def ticket_domain(ticket_id=False):
    if not app.config["change_domain"]:
        abort(404)

    if app.config["change_domain_only_admin_or_super_user"]:
        if not g.user.is_admin and not g.user.is_super_user:
            abort(404)

    form = DomainForm()
    ticket = FlicketTicket.query.get_or_404(ticket_id)

    if ticket.current_status.status == "Closed":
        flash(gettext("Can't change the domain on a closed ticket."))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    if form.validate_on_submit():
        domain = FlicketDomain.query.filter_by(domain=form.domain.data).one()

        if ticket.domain_id == domain.domain_id:
            flash(
                gettext(
                    f"Domain {ticket.domain.domain} is already assigned to ticket."
                ),
                category="warning",
            )
            return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

        # change domain
        ticket.domain_id = domain.domain_id

        # add action record
        add_action(
            ticket,
            "domain",
            data={"domain": domain.domain, "domain_id": domain.domain_id,},
        )

        db.session.commit()

        flash(gettext(f"You changed domain of ticket: {ticket_id}"), category="success")
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    title = gettext("Change Domain of Ticket")

    return render_template("flicket_domain.html", title=title, form=form, ticket=ticket)
Ejemplo n.º 10
0
def ticket_assign(ticket_id=False):
    form = SearchEmailForm()
    ticket = FlicketTicket.query.filter_by(id=ticket_id).one()

    if ticket.current_status.status == 'Closed':
        flash("Can't assign a closed ticket.")
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    if form.validate_on_submit():

        user = FlicketUser.query.filter_by(email=form.email.data).first()

        if ticket.assigned == user:
            flash('User is already assigned to ticket silly')
            return redirect(
                url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

        # set status to in work
        status = FlicketStatus.query.filter_by(status='In Work').first()
        # assign ticket
        ticket.assigned = user
        ticket.current_status = status

        # add action record
        add_action(action='assign', ticket=ticket, recipient=user)

        # subscribe to the ticket
        if not ticket.is_subscribed(user):
            subscribe = FlicketSubscription(ticket=ticket, user=user)
            db.session.add(subscribe)

        db.session.commit()

        # send email to state ticket has been assigned.
        f_mail = FlicketMail()
        f_mail.assign_ticket(ticket)

        flash('You reassigned ticket:{}'.format(ticket.id))
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    return render_template("flicket_assign.html",
                           title="Assign Ticket",
                           form=form,
                           ticket=ticket)
Ejemplo n.º 11
0
def change_status(ticket_id, status):
    ticket = FlicketTicket.query.filter_by(id=ticket_id).first()
    closed = FlicketStatus.query.filter_by(status=status).first()

    # Check to see if user is authorised to close ticket.
    edit = False
    if ticket.user == g.user:
        edit = True
    if ticket.assigned == g.user:
        edit = True
    if g.user.is_admin:
        edit = True

    if not edit:
        flash(
            gettext(
                "Only the person to which the ticket has been assigned, creator or Admin can close this ticket."
            ),
            category="warning",
        )
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    # Check to see if the ticket is already closed.
    if ticket.current_status.status == "Closed":
        flash(gettext("Ticket is already closed."), category="warning")
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    f_mail = FlicketMail()
    f_mail.close_ticket(ticket)

    # add action record
    add_action(ticket, "close")

    ticket.current_status = closed
    ticket.assigned_id = None
    db.session.commit()

    flash(
        gettext("Ticket %(value)s closed.", value=str(ticket_id).zfill(5)),
        category="success",
    )

    return redirect(url_for("flicket_bp.tickets"))
Ejemplo n.º 12
0
def subscribe_ticket(ticket_id=None):

    if ticket_id:

        ticket = FlicketTicket.query.filter_by(id=ticket_id).one()

        if not ticket.is_subscribed(g.user):
            # subscribe user to ticket
            subscribe = FlicketSubscription(user=g.user, ticket=ticket)
            ticket.last_updated = datetime.datetime.now()
            add_action(ticket, 'subscribe', recipient=g.user)
            db.session.add(subscribe)
            db.session.commit()
            flash(gettext('You have been subscribed to this ticket.'))

        else:

            flash(gettext('Already subscribed to this ticket'))

        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))
Ejemplo n.º 13
0
def ticket_claim(ticket_id=False):
    if ticket_id:
        # claim ticket
        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        if ticket.assigned == g.user:
            flash(gettext("You have already been assigned this ticket."))
            return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

        # set status to in work
        ticket.assigned = g.user
        g.user.total_assigned += 1
        db.session.commit()

        # add action record
        add_action(ticket, "claim")

        flash(gettext("You claimed ticket: %(value)s", value=ticket.id))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    return redirect(url_for("flicket_bp.tickets"))
Ejemplo n.º 14
0
def release(ticket_id=False):

    if ticket_id:

        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        # is ticket assigned.
        if not ticket.assigned:
            flash(gettext("Ticket has not been assigned"))
            return redirect(
                url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

        # check ticket is owned by user or user is admin
        if (ticket.assigned.id != g.user.id) and (not g.user.is_admin):
            flash(
                gettext(
                    "You can not release a ticket you are not working on."))
            return redirect(
                url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

        # set status to open
        status = FlicketStatus.query.filter_by(status="New").first()
        ticket.current_status = status
        user = ticket.assigned
        ticket.assigned = None
        user.total_assigned -= 1

        db.session.commit()

        # add action record
        add_action(ticket, "release")

        # send email to state ticket has been released.
        f_mail = FlicketMail()
        f_mail.release_ticket(ticket)

        flash(gettext("You released ticket: %(value)s", value=ticket.id))
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket.id))

    return redirect(url_for("flicket_bp.tickets"))
Ejemplo n.º 15
0
def change_status(ticket_id, status):
    ticket = FlicketTicket.query.filter_by(id=ticket_id).first()
    closed = FlicketStatus.query.filter_by(status=status).first()

    # Check to see if user is authorised to close ticket.
    edit = False
    if ticket.user == g.user:
        edit = True
    if ticket.assigned == g.user:
        edit = True
    if g.user.is_admin:
        edit = True

    if not edit:
        flash(gettext(
            'Only the person to which the ticket has been assigned, creator or Admin can close this ticket.'
        ),
              category='warning')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    # Check to see if the ticket is already closed.
    if ticket.current_status.status == 'Closed':
        flash(gettext('Ticket is already closed.'), category='warning')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    f_mail = FlicketMail()
    f_mail.close_ticket(ticket)

    # add action record
    add_action(ticket, 'close')

    ticket.current_status = closed
    ticket.assigned_id = None
    ticket.last_updated = datetime.datetime.now()
    db.session.commit()

    flash(gettext('Ticket %(value)s closed.', value=str(ticket_id).zfill(5)),
          category='success')

    return redirect(url_for('flicket_bp.tickets'))
Ejemplo n.º 16
0
def ticket_claim(ticket_id=False):
    if ticket_id:
        # claim ticket
        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        # set status to in work
        status = FlicketStatus.query.filter_by(status='In Work').first()
        ticket.assigned = g.user
        ticket.current_status = status
        db.session.commit()

        # add action record
        add_action(action='claim', ticket=ticket)

        # send email notifications
        f_mail = FlicketMail()
        f_mail.assign_ticket(ticket=ticket)

        flash('You claimed ticket:{}'.format(ticket.id))
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    return redirect(url_for('flicket_bp.tickets'))
Ejemplo n.º 17
0
def release(ticket_id=False):

    if ticket_id:

        ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

        # is ticket assigned.
        if not ticket.assigned:
            flash(gettext('Ticket has not been assigned'), category='warning')
            return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

        # check ticket is owned by user or user is admin
        if (ticket.assigned.id != g.user.id) and (not g.user.is_admin):
            flash(gettext('You can not release a ticket you are not working on.'), category='warning')
            return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

        # set status to open
        status = FlicketStatus.query.filter_by(status='Open').first()
        ticket.current_status = status
        ticket.last_updated = datetime.datetime.now()
        user = ticket.assigned
        ticket.assigned = None
        user.total_assigned -= 1

        db.session.commit()

        # add action record
        add_action(ticket, 'release')

        # send email to state ticket has been released.
        f_mail = FlicketMail()
        f_mail.release_ticket(ticket)

        flash(gettext('You released ticket: %(value)s', value=ticket.id), category='success')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket.id))

    return redirect(url_for('flicket_bp.tickets'))
Ejemplo n.º 18
0
def ticket_view(ticket_id, page=1):
    # todo: make sure underscores aren't allowed in usernames as it breaks markdown?

    # is ticket number legitimate
    ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

    if not ticket:
        flash(gettext('Cannot find ticket: "%(value)s"', value=ticket_id),
              category='warning')
        return redirect(url_for('flicket_bp.tickets'))

    # find all replies to ticket.
    replies = FlicketPost.query.filter_by(ticket_id=ticket_id).order_by(
        FlicketPost.date_added.asc())

    # get reply id's
    post_id = request.args.get('post_id')
    ticket_rid = request.args.get('ticket_rid')

    form = ReplyForm()
    subscribers_form = SubscribeUser()

    # add subscribed user
    if subscribers_form.sub_user.data and subscribers_form.validate_on_submit(
    ):
        user = FlicketUser.query.filter_by(
            username=subscribers_form.username.data).first()
        if user:
            if subscribe_user(ticket, user):
                flash(gettext('User subscribed.'), category='success')
            else:
                flash(gettext('User already subscribed.'), category="warning")
        else:
            flash(gettext('Invalid username.'), category='warning')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    # add reply post
    if (form.submit.data
            or form.submit_close.data) and form.validate_on_submit():
        # upload file if user has selected one and the file is in accepted list of
        files = request.files.getlist("file")
        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachments():
            upload_attachments.upload_files()

        new_reply = FlicketPost(
            ticket=ticket,
            user=g.user,
            date_added=datetime.datetime.now(),
            content=form.content.data,
            hours=form.hours.data,
        )

        if ticket.status_id != form.status.data:
            status = FlicketStatus.query.get(form.status.data)
            ticket.current_status = status
            add_action(ticket,
                       'status',
                       data={
                           'status_id': status.id,
                           'status': status.status
                       })

        if ticket.ticket_priority_id != form.priority.data:
            priority = FlicketPriority.query.get(form.priority.data)
            ticket.ticket_priority = priority
            add_action(ticket,
                       'priority',
                       data={
                           'priority_id': priority.id,
                           'priority': priority.priority
                       })

        db.session.add(new_reply)

        # add files to database.
        upload_attachments.populate_db(new_reply)

        # change ticket status to open if closed.
        if ticket.current_status.status.lower() == 'closed':
            ticket_open = FlicketStatus.query.filter_by(status='Open').first()
            ticket.current_status = ticket_open

        # subscribe to the ticket
        if not ticket.is_subscribed(g.user):
            subscribe = FlicketSubscription(ticket=ticket, user=g.user)
            db.session.add(subscribe)

        # add count of 1 to users total posts.
        g.user.total_posts += 1

        print('updating updating')
        ticket.last_updated = datetime.datetime.now()

        db.session.commit()

        # send email notification
        mail = FlicketMail()
        mail.reply_ticket(ticket=ticket, reply=new_reply, user=g.user)

        flash(gettext('You have replied to ticket %(value_1)s: %(value_2)s.',
                      value_1=ticket.id_zfill,
                      value_2=ticket.title),
              category="success")

        # if the reply has been submitted for closure.
        if form.submit_close.data:
            return redirect(
                url_for('flicket_bp.change_status',
                        ticket_id=ticket.id,
                        status='Closed'))

        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    # get post id and populate contents for auto quoting
    if post_id:
        query = FlicketPost.query.filter_by(id=post_id).first()
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=query.user.name,
            value_2=query.date_added,
            value_3=query.content)
        form.content.data = block_quoter(reply_contents)

    if ticket_rid:
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=ticket.user.name,
            value_2=ticket.date_added,
            value_3=ticket.content)
        form.content.data = block_quoter(reply_contents)

    replies = replies.paginate(page, app.config['posts_per_page'])

    form.status.data = ticket.status_id
    form.priority.data = ticket.ticket_priority_id

    title = f"Ticket #{ticket.id_zfill} {ticket.title}"

    # display or not category change link
    change_category = app.config['change_category']
    if change_category and app.config[
            'change_category_only_admin_or_super_user']:
        if not g.user.is_admin and not g.user.is_super_user:
            change_category = False

    return render_template('flicket_view.html',
                           title=title,
                           ticket=ticket,
                           form=form,
                           subscribers_form=subscribers_form,
                           replies=replies,
                           change_category=change_category,
                           page=page)
Ejemplo n.º 19
0
def ticket_view(ticket_id, page=1):
    # todo: make sure underscores aren't allowed in usernames as it breaks markdown?

    # is ticket number legitimate
    ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

    if not ticket:
        flash(gettext('Cannot find ticket: "%(value)s"', value=ticket_id),
              category='warning')
        return redirect(url_for('flicket_bp.tickets'))

    # find all replies to ticket.
    replies = FlicketPost.query.filter_by(ticket_id=ticket_id).order_by(
        FlicketPost.date_added.asc())

    # get reply id's
    post_rid = request.args.get('post_rid')
    ticket_rid = request.args.get('ticket_rid')

    form = ReplyForm()

    # add reply post
    if form.validate_on_submit():

        # upload file if user has selected one and the file is in accepted list of
        files = request.files.getlist("file")
        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachements():
            upload_attachments.upload_files()

        new_reply = FlicketPost(
            ticket=ticket,
            user=g.user,
            date_added=datetime.datetime.now(),
            content=form.content.data,
        )

        if ticket.status_id != form.status.data:
            ticket.status_id = form.status.data
            add_action(action=ticket.current_status.status, ticket=ticket)

        if ticket.ticket_priority_id != form.priority.data:
            ticket.ticket_priority_id = form.priority.data
            add_action(action=ticket.ticket_priority.priority, ticket=ticket)

        db.session.add(new_reply)

        # add files to database.
        upload_attachments.populate_db(new_reply)

        # change ticket status to open if closed.
        if ticket.current_status.status.lower() == 'closed':
            ticket_open = FlicketStatus.query.filter_by(status='Open').first()
            ticket.current_status = ticket_open

        # subscribe to the ticket
        if not ticket.is_subscribed(g.user):
            subscribe = FlicketSubscription(ticket=ticket, user=g.user)
            db.session.add(subscribe)

        # add count of 1 to users total posts.
        g.user.total_posts += 1

        db.session.commit()

        # send email notification
        mail = FlicketMail()
        mail.reply_ticket(ticket=ticket, reply=new_reply)

        flash(gettext('You have replied to ticket %(value_1)s: %(value_2)s.',
                      value_1=ticket.id_zfill,
                      value_2=ticket.title),
              category="success")

        # if the reply has been submitted for closure.
        if form.submit_close.data:
            return redirect(
                url_for('flicket_bp.change_status',
                        ticket_id=ticket.id,
                        status='Closed'))

        return redirect(url_for('flicket_bp.ticket_view', ticket_id=ticket_id))

    # get post id and populate contents for auto quoting
    if post_rid:
        query = FlicketPost.query.filter_by(id=post_rid).first()
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=query.user.name,
            value_2=query.date_added,
            value_3=query.content)
        form.content.data = block_quoter(reply_contents)
    if ticket_rid:
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=ticket.user.name,
            value_2=ticket.date_added,
            value_3=ticket.content)
        form.content.data = block_quoter(reply_contents)

    replies = replies.paginate(page, app.config['posts_per_page'])

    form.status.data = ticket.status_id

    title = gettext('View Ticket')

    return render_template('flicket_view.html',
                           title=title,
                           ticket=ticket,
                           form=form,
                           replies=replies,
                           page=page)
Ejemplo n.º 20
0
def ticket_view(ticket_id, page=1):
    # todo: make sure underscores aren't allowed in usernames as it breaks markdown?

    # is ticket number legitimate
    ticket = FlicketTicket.query.filter_by(id=ticket_id).first()

    if not ticket:
        flash(
            gettext('Cannot find ticket: "%(value)s"', value=ticket_id),
            category="warning",
        )
        return redirect(url_for("flicket_bp.tickets"))

    # find all replies to ticket.
    replies = FlicketPost.query.filter_by(ticket_id=ticket_id).order_by(
        FlicketPost.date_added.asc()
    )

    # get reply id's
    post_rid = request.args.get("post_rid")
    ticket_rid = request.args.get("ticket_rid")

    form = ReplyForm()
    subscribers_form = SubscribeUser()

    # add subscribed user
    if subscribers_form.validate_on_submit():

        user = FlicketUser.query.filter_by(
            username=subscribers_form.username.data
        ).first()
        if subscribe_user(ticket, user):
            flash(gettext("User subscribed."), category="success")
        else:
            flash(gettext("User already subscribed."), category="warning")
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    # add reply post
    if form.validate_on_submit():
        # upload file if user has selected one and the file is in accepted list of
        files = request.files.getlist("file")
        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachments():
            upload_attachments.upload_files()

        new_reply = FlicketPost(
            ticket=ticket,
            user=g.user,
            date_added=datetime.datetime.now(),
            content=form.content.data,
            days=form.days.data,
        )

        if ticket.request_stage_id != form.request_stage.data:
            request_stage = FlicketRequestStage.query.get(form.request_stage.data)
            ticket.request_stage = request_stage
            add_action(
                ticket,
                "request_stage",
                data={
                    "request_stage_id": request_stage.id,
                    "request_stage": request_stage.request_stage,
                },
            )

        if ticket.procedure_stage_id != form.procedure_stage.data:
            procedure_stage = FlicketProcedureStage.query.get(form.procedure_stage.data)
            ticket.procedure_stage = procedure_stage
            add_action(
                ticket,
                "procedure_stage",
                data={
                    "procedure_stage_id": procedure_stage.id,
                    "procedure_stage": procedure_stage.procedure_stage,
                },
            )

        db.session.add(new_reply)

        # add files to database.
        upload_attachments.populate_db(new_reply)

        # change ticket status to open if closed.
        if ticket.current_status and ticket.current_status.status == "Closed":
            ticket_open = FlicketStatus.query.filter_by(status="Open").first()
            ticket.current_status = ticket_open

        elif not ticket.current_status:
            ticket_open = FlicketStatus.query.filter_by(status="Open").first()
            ticket.current_status = ticket_open

        # subscribe to the ticket
        if not ticket.is_subscribed(g.user):
            subscribe = FlicketSubscription(ticket=ticket, user=g.user)
            db.session.add(subscribe)

        # add count of 1 to users total posts.
        g.user.total_posts += 1

        db.session.commit()

        # send email notification
        mail = FlicketMail()
        mail.reply_ticket(ticket=ticket, reply=new_reply, user=g.user)

        flash(
            gettext(
                "You have replied to ticket %(value_1)s: %(value_2)s.",
                value_1=ticket.id_zfill,
                value_2=ticket.title,
            ),
            category="success",
        )

        # if the reply has been submitted for closure.
        if form.submit_close.data:
            return redirect(
                url_for(
                    "flicket_bp.change_status", ticket_id=ticket.id, status="Closed"
                )
            )

        return redirect(url_for("flicket_bp.ticket_view", ticket_id=ticket_id))

    # get post id and populate contents for auto quoting
    if post_rid:
        query = FlicketPost.query.filter_by(id=post_rid).first()
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=query.user.name,
            value_2=query.date_added,
            value_3=query.content,
        )
        form.content.data = block_quoter(reply_contents)
    if ticket_rid:
        reply_contents = gettext(
            "%(value_1)s wrote on %(value_2)s\r\n\r\n%(value_3)s",
            value_1=ticket.user.name,
            value_2=ticket.date_added,
            value_3=ticket.content,
        )
        form.content.data = block_quoter(reply_contents)

    replies = replies.paginate(page, app.config["posts_per_page"])

    form.request_stage.data = ticket.request_stage_id
    form.procedure_stage.data = ticket.procedure_stage_id

    title = gettext("View Ticket")

    # display or not domain change link
    change_domain = app.config["change_domain"]
    if change_domain and app.config["change_domain_only_admin_or_super_user"]:
        if not g.user.is_admin and not g.user.is_super_user:
            change_domain = False

    return render_template(
        "flicket_view.html",
        title=title,
        ticket=ticket,
        form=form,
        subscribers_form=subscribers_form,
        replies=replies,
        change_domain=change_domain,
        page=page,
    )
Ejemplo n.º 21
0
def edit_post(post_id):
    form = EditReplyForm(post_id=post_id)

    post = FlicketPost.query.filter_by(id=post_id).first()

    if not post:
        flash("Could not find post.", category="warning")
        return redirect(url_for("flicket_bp.flicket_main"))

    # check to see if topic is closed. ticket can't be edited once it's closed.
    if is_ticket_closed(post.ticket.current_status.status):
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=post.ticket.id))

    # check user is authorised to edit post. Only author or admin can do this.
    not_authorised = True
    if post.user == g.user or g.user.is_admin:
        not_authorised = False
    if not_authorised:
        flash("You are not authorised to edit this ticket.", category="warning")
        return redirect(url_for("flicket_bp.ticket_view", ticket_id=post.ticket_id))

    if form.validate_on_submit():

        # before we make any changes store the original post content in the history table if it has changed.
        if post.modified_id:
            history_id = post.modified_id
        else:
            history_id = post.user_id
        if post.content != form.content.data:
            history = FlicketHistory(
                original_content=post.content,
                post=post,
                date_modified=datetime.datetime.now(),
                user_id=history_id,
            )
            db.session.add(history)

        # loop through the selected uploads for deletion.
        if len(form.uploads.data) > 0:
            for i in form.uploads.data:
                # get the upload document information from the database.
                query = FlicketUploads.query.filter_by(id=i).first()
                # define the full uploaded filename
                the_file = os.path.join(
                    app.config["ticket_upload_folder"], query.filename
                )

                if os.path.isfile(the_file):
                    # delete the file from the folder
                    os.remove(the_file)

                db.session.delete(query)

        post.content = form.content.data
        post.modified = g.user
        post.date_modified = datetime.datetime.now()
        post.days = form.days.data

        if post.ticket.request_stage_id != form.request_stage.data:
            request_stage = FlicketRequestStage.query.get(form.request_stage.data)
            post.ticket.request_stage = request_stage
            add_action(
                post.ticket,
                "request_stage",
                data={
                    "request_stage_id": request_stage.id,
                    "request_stage": request_stage.request_stage,
                },
            )
        if post.ticket.procedure_stage_id != form.procedure_stage.data:
            procedure_stage = FlicketProcedureStage.query.get(form.procedure_stage.data)
            post.ticket.procedure_stage = procedure_stage
            add_action(
                post.ticket,
                "procedure_stage",
                data={
                    "procedure_stage_id": procedure_stage.id,
                    "procedure_stage": procedure_stage.procedure_stage,
                },
            )

        files = request.files.getlist("file")
        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachments():
            upload_attachments.upload_files()

        # add files to database.
        upload_attachments.populate_db(post)

        db.session.commit()
        flash("Post successfully edited.", category="success")

        return redirect(url_for("flicket_bp.ticket_view", ticket_id=post.ticket_id))

    form.content.data = post.content
    form.days.data = post.days
    form.request_stage.data = post.ticket.request_stage_id
    form.procedure_stage.data = post.ticket.procedure_stage_id

    return render_template("flicket_editpost.html", title="Edit Post", form=form)
Ejemplo n.º 22
0
def edit_post(post_id):
    form = EditReplyForm(post_id=post_id)

    post = FlicketPost.query.filter_by(id=post_id).first()

    if not post:
        flash('Could not find post.', category='warning')
        return redirect(url_for('flicket_bp.flicket_main'))

    # check to see if topic is closed. ticket can't be edited once it's closed.
    if is_ticket_closed(post.ticket.current_status.status):
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=post.ticket.id))

    # check user is authorised to edit post. Only author or admin can do this.
    not_authorised = True
    if post.user == g.user or g.user.is_admin:
        not_authorised = False
    if not_authorised:
        flash('You are not authorised to edit this ticket.', category='warning')
        return redirect(url_for('flicket_bp.ticket_view', ticket_id=post.ticket_id))

    if form.validate_on_submit():

        # stop closing of ticket via edit.
        if form.status.data == 2:
            flash('You can not edit and close ticket.')

        # before we make any changes store the original post content in the history table if it has changed.
        if post.modified_id:
            history_id = post.modified_id
        else:
            history_id = post.user_id
        if post.content != form.content.data:
            history = FlicketHistory(
                original_content=post.content,
                post=post,
                date_modified=datetime.datetime.now(),
                user_id=history_id
            )
            db.session.add(history)

        # loop through the selected uploads for deletion.
        if len(form.uploads.data) > 0:
            for i in form.uploads.data:
                # get the upload document information from the database.
                query = FlicketUploads.query.filter_by(id=i).first()
                # define the full uploaded filename
                the_file = os.path.join(app.config['ticket_upload_folder'], query.filename)

                if os.path.isfile(the_file):
                    # delete the file from the folder
                    os.remove(the_file)

                db.session.delete(query)

        post.content = form.content.data
        post.modified = g.user
        post.date_modified = datetime.datetime.now()

        if post.ticket.status_id != form.status.data:
            post.ticket.status_id = form.status.data
            add_action(action=post.ticket.current_status.status, ticket=post.ticket)

        if post.ticket.ticket_priority_id != form.priority.data:
            post.ticket.ticket_priority_id = form.priority.data
            add_action(action=post.ticket.ticket_priority.priority, ticket=post.ticket)

        files = request.files.getlist("file")
        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachements():
            upload_attachments.upload_files()

        # add files to database.
        upload_attachments.populate_db(post)

        db.session.commit()
        flash('Post successfully edited.', category='success')

        return redirect(url_for('flicket_bp.ticket_view', ticket_id=post.ticket_id))

    form.content.data = post.content

    return render_template('flicket_editpost.html',
                           title='Edit Post',
                           form=form)