diff --git a/src/h4il/settings.py b/src/h4il/settings.py index 427ce37..205b224 100644 --- a/src/h4il/settings.py +++ b/src/h4il/settings.py @@ -161,6 +161,7 @@ 'q13es', 'student_applications', 'hashmabir', + 'tickets', 'allauth', 'allauth.account', diff --git a/src/tickets/__init__.py b/src/tickets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tickets/forms.py b/src/tickets/forms.py new file mode 100644 index 0000000..439642f --- /dev/null +++ b/src/tickets/forms.py @@ -0,0 +1,11 @@ +# TODO : I'm not familiar with floppyforms. So I'm using regular Django +# forms and we need to convert them. + +from django import forms + +from .models import Ticket, TicketComment + +class TicketForm(forms.ModelForm): + + class Meta: + model = Ticket diff --git a/src/tickets/migrations/0001_initial.py b/src/tickets/migrations/0001_initial.py new file mode 100644 index 0000000..b0d5386 --- /dev/null +++ b/src/tickets/migrations/0001_initial.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Ticket' + db.create_table(u'tickets_ticket', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tickets', to=orm['users.HackitaUser'])), + ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)), + ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, db_index=True, blank=True)), + ('creaetd_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='tickets_created', to=orm['users.HackitaUser'])), + ('text', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal(u'tickets', ['Ticket']) + + # Adding model 'TicketComment' + db.create_table(u'tickets_ticketcomment', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(related_name='ticket_comments', to=orm['users.HackitaUser'])), + ('text', self.gf('django.db.models.fields.CharField')(max_length=500)), + ('ticket', self.gf('django.db.models.fields.related.ForeignKey')(related_name='comments', to=orm['tickets.Ticket'])), + ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)), + ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, db_index=True, blank=True)), + )) + db.send_create_signal(u'tickets', ['TicketComment']) + + + def backwards(self, orm): + # Deleting model 'Ticket' + db.delete_table(u'tickets_ticket') + + # Deleting model 'TicketComment' + db.delete_table(u'tickets_ticketcomment') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'tickets.ticket': { + 'Meta': {'object_name': 'Ticket'}, + 'creaetd_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tickets_created'", 'to': u"orm['users.HackitaUser']"}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tickets'", 'to': u"orm['users.HackitaUser']"}) + }, + u'tickets.ticketcomment': { + 'Meta': {'object_name': 'TicketComment'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ticket_comments'", 'to': u"orm['users.HackitaUser']"}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '500'}), + 'ticket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': u"orm['tickets.Ticket']"}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}) + }, + u'users.hackitauser': { + 'Meta': {'object_name': 'HackitaUser'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + } + } + + complete_apps = ['tickets'] \ No newline at end of file diff --git a/src/tickets/migrations/__init__.py b/src/tickets/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tickets/models.py b/src/tickets/models.py new file mode 100644 index 0000000..5975a17 --- /dev/null +++ b/src/tickets/models.py @@ -0,0 +1,39 @@ +import datetime + +from django.conf import settings +from django.db import models + +class Ticket(models.Model): + """ + Ticket for the ticket system. Handles the communication between + users and admins. + """ + + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + related_name='tickets', + db_index=True, + help_text="The user whose dashboard this ticket is attached") + + created_at = models.DateTimeField(auto_now_add=True, db_index=True) + updated_at = models.DateTimeField(auto_now=True, db_index=True) + + creaetd_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='tickets_created', db_index=True) + + text = models.TextField(help_text="Ticket Body") + +class TicketComment(models.Model): + """ + A comment on a ticket. + """ + + author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="ticket_comments") + text = models.CharField(max_length=500) + + ticket = models.ForeignKey(Ticket, related_name="comments") + + created_at = models.DateTimeField(auto_now_add=True, db_index=True) + updated_at = models.DateTimeField(auto_now=True, db_index=True) + + def __unicode__(self): + return '%s (%s)' % (self.text, self.author) diff --git a/src/tickets/tests.py b/src/tickets/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/src/tickets/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/src/tickets/views.py b/src/tickets/views.py new file mode 100644 index 0000000..f3fa63e --- /dev/null +++ b/src/tickets/views.py @@ -0,0 +1,74 @@ +from django.contrib.auth.decorators import login_required +from django.views.generic.edit import FormView +from django.views.generic.base import TemplateView + +from .forms import TicketForm +from .models import Ticket, TicketComment + +class TicketView(FormView): + """""" + + template_name = 'ticket.html' + form_class = TicketForm + + @method_decorator(login_required) + def dispatch(self, request, *args, **kwargs): + form = self.get_form_class() + if form is None: + return redirect('dashboard') + + return super(TicketView, self).dispatch(request, *args, **kwargs) + + def form_valid(self, form): + + # Send email + + return super(TicketView, self).form_valid(form) + # def get_form_class(self): + # form_name = get_user_next_form(self.request.user) + # if not form_name: + # return None + + # return FORMS[form_name] + + # def form_valid(self, form): + # u = self.request.user + # data = form.cleaned_data + # form_name = get_user_next_form(u) + + # logger.info("User %s filled %s" % (u, form_name)) + + # Answer.objects.create(user=u, q13e_slug=form_name, data=data) + + # # Save personal information + # if form_name == FORM_NAMES[0]: + # dirty = False + # if not u.first_name: + # u.first_name = data['hebrew_first_name'] + # dirty = True + # if not u.last_name: + # u.last_name = data['hebrew_last_name'] + # dirty = True + # if dirty: + # u.save() + + # message = "\n".join(u"{label}: {html}".format(**fld) for fld in + # get_pretty_answer(form, data)['fields']) + # mail_managers(u"{}: {hebrew_last_name} {hebrew_first_name}".format( + # _("New User"), **data), message) + + # if get_user_next_form(u) is None: + # messages.success(self.request, + # _("Registration completed! Thank you very much!")) + # mail_managers(_("User registered: %s") % u, ":-)") + # return redirect('dashboard') + + # messages.success(self.request, _("'%s' was saved.") % form.form_title) + + # return redirect('register') + + # def form_invalid(self, form): + # messages.warning(self.request, + # _("Problems detected in form. " + # "Please fix your errors and try again.")) + # return FormView.form_invalid(self, form)