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'))
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'))
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))
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)
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)
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
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 )
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)
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)
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)
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"))
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))
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"))
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"))
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'))
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'))
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'))
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)
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)
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, )
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)
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)