Esempio n. 1
0
def create_ticket():
    data = request.get_json() or {}

    if 'title' not in data or 'content' not in data or 'category_id' not in data or 'ticket_priority_id' not in data:
        return bad_request('Must include title, content, category_id and ticket_priority_id.')

    if not isinstance(data['category_id'], int) or not isinstance(data['ticket_priority_id'], int):
        return bad_request('ticket_priority_id and category_id must be integers.')

    if not FlicketCategory.query.filter_by(id=data['category_id']).first():
        return bad_request('not a valid category_id')

    if not FlicketPriority.query.filter_by(id=data['ticket_priority_id']).first():
        return bad_request('not a valid ticket_priority_id')

    ticket = FlicketTicket()
    ticket.from_dict(data)
    ticket.started_id = g.current_user.id
    ticket.date_added = datetime.datetime.now()
    ticket.status_id = 1

    db.session.add(ticket)
    db.session.commit()

    response = jsonify(ticket.to_dict())
    response.status_code = 201
    response.headers['Location'] = url_for('bp_api.get_ticket', id=ticket.id)

    return response
def topic_creation():
    # if the number of topics is already satisfied don't add any more.
    topic_count = FlicketTicket.query.count()
    if topic_count == num_topics:
        print('Topic number already satisfied')
        return

    for i in range(topic_count, num_topics):

        new_ticket = FlicketTicket(
            title=get_random_words(),
            content=get_random_sentence(),
            user=get_random_user(),
            date_added=datetime.datetime.now(),
            current_status=get_random_status(),
            ticket_priority=get_random_priority(),
            category=get_random_category(),
            assigned=get_random_user()
        )

        db.session.add(new_ticket)
        mess_1 = "#{}: ticket ....".format(i)
        print(mess_1, end="\r")

        replies = randint(0, num_replies)

        for ii in range(0, replies):
            create_ticket_reply(new_ticket)
            mess_2 = mess_1 + "adding replies ... # {}".format(ii)
            print(mess_2, end="\r")

        db.session.commit()
Esempio n. 3
0
def get_tickets(page=1):
    # todo: add filtering

    tickets = FlicketTicket.query
    per_page = min(request.args.get('per_page', app.config['posts_per_page'], type=int), 100)
    data = FlicketTicket.to_collection_dict(tickets, page, per_page, 'bp_api.get_tickets')
    return jsonify(data)
Esempio n. 4
0
    def create_ticket(title=None,
                      user=None,
                      content=None,
                      priority=None,
                      category=None,
                      files=None,
                      hours=0):
        """
        :param title:
        :param user:
        :param content:
        :param priority:
        :param category:
        :param files:
        :param hours:
        :return:
        """

        ticket_status = FlicketStatus.query.filter_by(status="Open").first()
        ticket_priority = FlicketPriority.query.filter_by(
            id=int(priority)).first()
        ticket_category = FlicketCategory.query.filter_by(
            id=int(category)).first()

        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachments():
            upload_attachments.upload_files()

        date_added = datetime.datetime.now()

        # submit ticket data to database
        new_ticket = FlicketTicket(
            title=title,
            date_added=date_added,
            user=user,
            current_status=ticket_status,
            content=content,
            ticket_priority=ticket_priority,
            category=ticket_category,
            hours=hours,
            last_updated=date_added,
        )

        db.session.add(new_ticket)
        # add attachments to the database
        upload_attachments.populate_db(new_ticket)
        # subscribe user to ticket.
        subscribe = FlicketSubscription(user=user, ticket=new_ticket)
        db.session.add(subscribe)

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

        db.session.commit()

        return new_ticket
Esempio n. 5
0
def tickets(page=1):
    form = SearchTicketForm()

    # get request arguments from the url
    status = request.args.get('status')
    department = request.args.get('department')
    category = request.args.get('category')
    content = request.args.get('content')
    user_id = request.args.get('user_id')

    if form.validate_on_submit():
        redirect_url = FlicketTicket.form_redirect(form,
                                                   url='flicket_bp.tickets')

        return redirect(redirect_url)

    ticket_query, form = FlicketTicket.query_tickets(form,
                                                     department=department,
                                                     category=category,
                                                     status=status,
                                                     user_id=user_id,
                                                     content=content)
    number_results = ticket_query.count()

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

    title = gettext('Tickets')

    # todo: pull from api on page load as other fields?
    if content:
        form.content.data = content

    return render_template('flicket_tickets.html',
                           title=title,
                           form=form,
                           tickets=ticket_query,
                           page=page,
                           number_results=number_results,
                           status=status,
                           department=department,
                           category=category,
                           user_id=user_id,
                           base_url='flicket_bp.tickets')
Esempio n. 6
0
def tickets_csv():
    # get request arguments from the url
    status = request.args.get("status")
    institute = request.args.get("institute")
    domain = request.args.get("domain")
    content = request.args.get("content")
    requester = request.args.get("requester")
    referee = request.args.get("referee")
    user_id = request.args.get("user_id")

    ticket_query, form = FlicketTicket.query_tickets(
        institute=institute,
        domain=domain,
        status=status,
        user_id=user_id,
        content=content,
        requester=requester,
        referee=referee,
    )
    ticket_query = ticket_query.limit(app.config["csv_dump_limit"])

    date_stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
    file_name = date_stamp + "ticketdump.csv"

    csv_contents = "Ticket_ID,Title,Submitted By,Date,Replies,Total Days,Institute,Domain,Assigned,URL\n"
    for ticket in ticket_query:

        if hasattr(ticket.assigned, "name"):
            _name = ticket.assigned.name
        else:
            _name = ticket.user.name

        csv_contents += (
            f"{ticket.id_zfill},"
            f"{clean_csv_data(ticket.title)},"
            f'"{ticket.user.name}",'
            f'{ticket.date_added.strftime("%Y-%m-%d")},'
            f"{ticket.num_replies},"
            f"{ticket.total_days},"
            f"{clean_csv_data(ticket.institute.institute)},"
            f"{clean_csv_data(ticket.domain.domain)},"
            f"{_name},"
            f'{app.config["base_url"]}'
            f'{url_for("flicket_bp.ticket_view", ticket_id=ticket.id)}\n')

    return Response(
        csv_contents,
        mimetype="text/csv",
        headers={"Content-disposition": f"attachment; filename={file_name}"},
    )
def ticket_create():
    form = CreateTicketForm()

    if form.validate_on_submit():

        # this is a new post so ticket status is 'open'
        ticket_status = FlicketStatus.query.filter_by(status='open').first()
        ticket_priority = FlicketPriority.query.filter_by(
            id=int(form.priority.data)).first()
        ticket_category = FlicketCategory.query.filter_by(
            id=int(form.category.data)).first()

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

        # submit ticket data to database
        new_ticket = FlicketTicket(title=form.title.data,
                                   date_added=datetime.datetime.now(),
                                   user=g.user,
                                   current_status=ticket_status,
                                   content=form.content.data,
                                   ticket_priority=ticket_priority,
                                   category=ticket_category)
        db.session.add(new_ticket)

        # add attachments to the dataabase.
        upload_attachments.populate_db(new_ticket)
        # subscribe user to ticket
        subscribe = FlicketSubscription(user=g.user, ticket=new_ticket)
        db.session.add(subscribe)

        # commit changes to the database
        db.session.commit()

        # send email
        # TEST SEND EMAIL HERE
        f_mail = FlicketMail()
        f_mail.create_ticket(ticket=new_ticket)

        flash('New Ticket created.', category='success')

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

    return render_template('flicket_create.html',
                           title='Flicket - Create Ticket',
                           form=form)
Esempio n. 8
0
def index():
    """ View showing flicket main page. We use this to display some statistics."""
    days = 7

    # CAROUSEL
    tickets = FlicketTicket.carousel_query()

    # PIE CHARTS
    ids, graph_json = create_pie_chart_dict()

    return render_template('flicket_index.html',
                           days=days,
                           tickets=tickets,
                           ids=ids,
                           graph_json=graph_json)
Esempio n. 9
0
    def __init__(self, user):

        title = 'I have a problem with my mouse'
        content = 'It squeeks! most troublesome.'

        status = FlicketStatus.query.first()
        priority = FlicketPriority.query.first()
        category = FlicketCategory.query.first()

        self.ticket = FlicketTicket(title=title,
                                    date_added=datetime.datetime.now(),
                                    user=user,
                                    current_status=status,
                                    content=content,
                                    ticket_priority=priority,
                                    category=category)
        db.session.add(self.ticket)
        db.session.commit()
Esempio n. 10
0
def tickets_csv():
    # get request arguments from the url
    status = request.args.get('status')
    department = request.args.get('department')
    category = request.args.get('category')
    content = request.args.get('content')
    user_id = request.args.get('user_id')

    ticket_query, form = FlicketTicket.query_tickets(department=department, category=category, status=status,
                                                     user_id=user_id, content=content)
    ticket_query = ticket_query.limit(app.config['csv_dump_limit'])

    date_stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
    file_name = date_stamp + 'ticketdump.csv'

    csv_contents = 'Ticket_ID,Priority,Title,Submitted By,Date,Replies,Category,Status,Assigned,URL\n'
    for ticket in ticket_query:

        if hasattr(ticket.assigned, 'name'):
            _name = ticket.assigned.name
        else:
            _name = 'Not assigned'

        csv_contents += '{},{},"{}",{},{},{},{} - {},{},{},{}{}\n'.format(ticket.id_zfill,
                                                                          ticket.ticket_priority.priority,
                                                                          clean_csv_data(ticket.title),
                                                                          ticket.user.name,
                                                                          ticket.date_added.strftime("%Y-%m-%d"),
                                                                          ticket.num_replies,
                                                                          clean_csv_data(
                                                                              ticket.category.department.department),
                                                                          clean_csv_data(ticket.category.category),
                                                                          ticket.current_status.status,
                                                                          _name,
                                                                          app.config["base_url"],
                                                                          url_for("flicket_bp.ticket_view",
                                                                                  ticket_id=ticket.id))

    return Response(
        csv_contents,
        mimetype='text/csv',
        headers={"Content-disposition":
                 f"attachment; filename={file_name}"}
    )
Esempio n. 11
0
def create_ticket():
    data = request.get_json() or {}

    if "title" not in data or "content" not in data or "domain_id" not in data:
        return bad_request("Must include title, content, domain_id")

    if not FlicketDomain.query.filter_by(id=data["domain_id"]).first():
        return bad_request("not a valid domain_id")

    ticket = FlicketTicket()
    ticket.from_dict(data)
    ticket.started_id = g.current_user.id
    ticket.date_added = datetime.datetime.now()
    ticket.status_id = 1

    db.session.add(ticket)
    db.session.commit()

    response = jsonify(ticket.to_dict())
    response.status_code = 201
    response.headers["Location"] = url_for("bp_api.get_ticket", id=ticket.id)

    return response
def topic_creation(num_topics_):
    # if the number of topics is already satisfied don't add any more.
    topic_count = FlicketTicket.query.count()
    if topic_count >= num_topics_:
        print('Topic number already satisfied')
        return
    else:
        num_topics_ = num_topics_ - topic_count

    for i in range(topic_count, num_topics_):

        t = Text()

        new_ticket = FlicketTicket(
            title=t.title()[0:field_size['title_max_length']],
            content=t.text(randint(3, 15)),
            user=get_random_user(),
            date_added=datetime.datetime.now(),
            current_status=get_random_status(),
            ticket_priority=get_random_priority(),
            category=get_random_category(),
            assigned=get_random_user()
        )

        new_ticket.user.total_posts += 1

        db.session.add(new_ticket)
        mess_1 = "#{}: ticket ....".format(i)
        print(mess_1, end="\r")

        replies = randint(0, num_replies)

        for ii in range(0, replies):
            create_ticket_reply(new_ticket)
            mess_2 = mess_1 + "adding replies ... # {}".format(ii)
            print(mess_2, end="\r")

        db.session.commit()
Esempio n. 13
0
    def create_ticket(
        title=None,
        user=None,
        content=None,
        requester=None,
        referee=None,
        requester_role=None,
        request_stage=None,
        procedure_stage=None,
        domain=None,
        institute=None,
        files=None,
        days=0,
    ):
        """
        :param title:
        :param user:
        :param content:
        :param requester:
        :param requester_role:
        :param domain:
        :param files:
        :param days:
        :return:
        """

        ticket_status = FlicketStatus.query.filter_by(status="Open").first()
        ticket_institute = FlicketInstitute.query.filter_by(
            id=int(institute)).first()
        ticket_domain = FlicketDomain.query.filter_by(id=int(domain)).first()
        requester_role = FlicketRequesterRole.query.filter_by(
            id=int(requester_role)).first()

        request_stage = FlicketRequestStage.query.filter_by(
            request_stage="New").first()
        procedure_stage = FlicketProcedureStage.query.filter_by(
            id=int(procedure_stage)).first()

        upload_attachments = UploadAttachment(files)
        if upload_attachments.are_attachments():
            upload_attachments.upload_files()

        # submit ticket data to database
        new_ticket = FlicketTicket(
            title=title,
            date_added=datetime.datetime.now(),
            user=user,
            current_status=ticket_status,
            content=content,
            institute=ticket_institute,
            requester=requester,
            referee=referee,
            requester_role=requester_role,
            request_stage=request_stage,
            procedure_stage=procedure_stage,
            domain=ticket_domain,
            days=days,
        )

        db.session.add(new_ticket)
        # add attachments to the database
        upload_attachments.populate_db(new_ticket)
        # subscribe user to ticket.
        subscribe = FlicketSubscription(user=user, ticket=new_ticket)
        db.session.add(subscribe)

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

        db.session.commit()

        return new_ticket
Esempio n. 14
0
def tickets_view(page, is_my_view=False):
    """
        Function common to 'tickets' and 'my_tickets' expect where query is filtered for users own tickets.
    """

    form = SearchTicketForm()

    # get request arguments from the url
    status = request.args.get('status')
    department = request.args.get('department')
    category = request.args.get('category')
    content = request.args.get('content')
    user_id = request.args.get('user_id')

    if form.validate_on_submit():
        redirect_url = FlicketTicket.form_redirect(form,
                                                   url='flicket_bp.tickets')

        return redirect(redirect_url)

    arg_sort = request.args.get('sort')
    if arg_sort:
        args = request.args.copy()
        del args['sort']

        response = make_response(
            redirect(url_for('flicket_bp.tickets', **args)))
        response.set_cookie('tickets_sort',
                            arg_sort,
                            max_age=2419200,
                            path=url_for('flicket_bp.tickets', **args))

        return response

    sort = request.cookies.get('tickets_sort')
    if sort:
        set_cookie = True
    else:
        sort = 'priority_desc'
        set_cookie = False

    ticket_query, form = FlicketTicket.query_tickets(form,
                                                     department=department,
                                                     category=category,
                                                     status=status,
                                                     user_id=user_id,
                                                     content=content)
    if is_my_view:
        ticket_query = FlicketTicket.my_tickets(ticket_query)
    ticket_query = FlicketTicket.sorted_tickets(ticket_query, sort)
    number_results = ticket_query.count()

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

    title = gettext('Tickets')
    if is_my_view:
        title = gettext('My Tickets')

    if content:
        form.content.data = content

    response = make_response(
        render_template('flicket_tickets.html',
                        title=title,
                        form=form,
                        tickets=ticket_query,
                        page=page,
                        number_results=number_results,
                        status=status,
                        department=department,
                        category=category,
                        user_id=user_id,
                        sort=sort,
                        base_url='flicket_bp.tickets'))

    if set_cookie:
        response.set_cookie('tickets_sort',
                            sort,
                            max_age=2419200,
                            path=url_for('flicket_bp.tickets'))

    return response
Esempio n. 15
0
def tickets_view(page, is_my_view=False):
    """
    Function common to 'tickets' and 'my_tickets' expect where query is filtered for users own tickets.
    """

    form = SearchTicketForm()

    # get request arguments from the url
    status = request.args.get("status")
    institute = request.args.get("institute")
    domain = request.args.get("domain")
    content = request.args.get("content")
    requester = request.args.get("requester")
    referee = request.args.get("referee")
    user_id = request.args.get("user_id")
    requester_role = request.args.get("requester_role")
    request_stage = request.args.get("request_stage")
    procedure_stage = request.args.get("procedure_stage")

    if form.validate_on_submit():
        redirect_url = FlicketTicket.form_redirect(form,
                                                   url="flicket_bp.tickets")

        return redirect(redirect_url)

    arg_sort = request.args.get("sort")
    if arg_sort:
        print(arg_sort)
        args = request.args.copy()
        del args["sort"]

        response = make_response(
            redirect(url_for("flicket_bp.tickets", **args)))
        response.set_cookie(
            "tickets_sort",
            arg_sort,
            max_age=2419200,
            path=url_for("flicket_bp.tickets", **args),
        )

        return response

    sort = request.cookies.get("tickets_sort")
    if sort:
        set_cookie = True
    else:
        sort = "date_desc"
        set_cookie = False

    ticket_query, form = FlicketTicket.query_tickets(
        form,
        institute=institute,
        domain=domain,
        status=status,
        user_id=user_id,
        content=content,
        requester=requester,
        referee=referee,
        requester_role=requester_role,
        request_stage=request_stage,
        procedure_stage=procedure_stage,
    )
    if is_my_view:
        ticket_query = FlicketTicket.my_tickets(ticket_query)
    ticket_query = FlicketTicket.sorted_tickets(ticket_query, sort)
    number_results = ticket_query.count()

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

    title = gettext("Tickets")
    if is_my_view:
        title = gettext("My Tickets")

    if content:
        form.content.data = content
    if requester:
        form.requester.data = requester
    if referee:
        form.referee.data = referee

    response = make_response(
        render_template(
            "flicket_tickets.html",
            title=title,
            form=form,
            tickets=ticket_query,
            page=page,
            number_results=number_results,
            status=status,
            institute=institute,
            domain=domain,
            requester_role=requester_role,
            request_stage=request_stage,
            procedure_stage=procedure_stage,
            user_id=user_id,
            sort=sort,
            base_url="flicket_bp.tickets",
        ))

    if set_cookie:
        response.set_cookie("tickets_sort",
                            sort,
                            max_age=2419200,
                            path=url_for("flicket_bp.tickets"))

    return response
Esempio n. 16
0
def tickets(page=1):
    form = SearchTicketForm()

    # get request arguments from the url
    status = request.args.get('status')
    department = request.args.get('department')
    category = request.args.get('category')
    content = request.args.get('content')
    user_id = request.args.get('user_id')

    if form.validate_on_submit():
        redirect_url = FlicketTicket.form_redirect(form,
                                                   url='flicket_bp.tickets')

        return redirect(redirect_url)

    sort = request.args.get('sort')
    if sort:
        args = request.args.copy()
        del args['sort']

        response = make_response(
            redirect(url_for('flicket_bp.tickets', **args)))
        response.set_cookie('tickets_sort',
                            sort,
                            max_age=2419200,
                            path=url_for('flicket_bp.tickets'))

        return response

    sort = request.cookies.get('tickets_sort')
    if sort:
        set_cookie = True
    else:
        sort = 'priority_desc'
        set_cookie = False

    ticket_query, form = FlicketTicket.query_tickets(form,
                                                     department=department,
                                                     category=category,
                                                     status=status,
                                                     user_id=user_id,
                                                     content=content)
    ticket_query = FlicketTicket.sorted_tickets(ticket_query, sort)
    number_results = ticket_query.count()

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

    title = gettext('Tickets')

    # todo: pull from api on page load as other fields?
    if content:
        form.content.data = content

    response = make_response(
        render_template('flicket_tickets.html',
                        title=title,
                        form=form,
                        tickets=ticket_query,
                        page=page,
                        number_results=number_results,
                        status=status,
                        department=department,
                        category=category,
                        user_id=user_id,
                        sort=sort,
                        base_url='flicket_bp.tickets'))

    if set_cookie:
        response.set_cookie('tickets_sort',
                            sort,
                            max_age=2419200,
                            path=url_for('flicket_bp.tickets'))

    return response