diff --git a/projectsheet/admin.py b/projectsheet/admin.py index 96cf867..9aafdb5 100644 --- a/projectsheet/admin.py +++ b/projectsheet/admin.py @@ -8,16 +8,6 @@ from .models import ProjectSheet, ProjectSheetTemplate, ProjectSheetQuestion, ProjectSheetQuestionAnswer, QuestionChoice -class EditLinkToInlineObject(object): - def edit_link(self, instance): - url = reverse('admin:%s_%s_change' % ( - instance._meta.app_label, instance._meta.module_name), args=[instance.pk] ) - if instance.pk: - return mark_safe(u'edit'.format(u=url)) - else: - return '' - - # HEADS UP: currently not possible to inherit from # StackedInline with SimpleHistoryAdmin. class ProjectSheetQuestionAnswerInline(StackedInline): @@ -34,32 +24,47 @@ class QuestionChoiceInline(StackedInline): readonly_fields = ('value',) -class ProjectSheetQuestionInline(EditLinkToInlineObject, StackedInline): - model = ProjectSheetQuestion +class ProjectSheetQuestionInline(StackedInline): + model = ProjectSheetQuestion.template.through extra = 0 min_num = 1 - readonly_fields = ('get_choices', 'edit_link' ) + readonly_fields = ('get_choices', 'edit_questions_link', ) def get_choices(self, obj): choices_string = "" - for choice in obj.choices.all(): - choices_string += choice.text+', ' - return choices_string + try: + question_object = ProjectSheetQuestion.objects.get(pk=obj.projectsheetquestion_id) + for choice in question_object.choices.all(): + choices_string += choice.text+', ' + return choices_string + except Exception as e: + return choices_string + + def edit_questions_link(self, instance): + url = reverse('admin:%s_%s_change' % ( + instance._meta.app_label, 'projectsheetquestion'), args=[instance.projectsheetquestion_id] ) + if instance.projectsheetquestion_id: + return mark_safe(u'edit'.format(u=url)) + else: + return '' get_choices.short_description = 'Choix' class ProjectSheetQuestionAdmin(admin.ModelAdmin): + exclude = ('template', ) inlines = [QuestionChoiceInline] - list_display = [ 'id', 'related_template', '__unicode__'] + list_display = [ 'id', '__unicode__'] + # FIXME : adapt to M2M def related_template(self, obj): return '%s'%(obj.template.name) related_template.short_description = 'Template' class ProjectSheetTemplateAdmin(admin.ModelAdmin): - inlines = [ProjectSheetQuestionInline] + # pass + inlines = [ProjectSheetQuestionInline] class ProjectSheetAdmin(SimpleHistoryAdmin): diff --git a/projectsheet/api.py b/projectsheet/api.py index 11936e8..023f11b 100644 --- a/projectsheet/api.py +++ b/projectsheet/api.py @@ -28,7 +28,7 @@ class Meta: always_return_data = True class ProjectSheetQuestionResource(ModelResource): - choices = fields.ToManyField(QuestionChoiceResource, 'choices', full=True, null=True) + choices = fields.ForeignKey(QuestionChoiceResource, 'choices', full=True, null=True) class Meta: queryset = ProjectSheetQuestion.objects.all() allowed_methods = ['post', 'get'] diff --git a/projectsheet/migrations/0011_auto__del_field_projectsheetquestion_template.py b/projectsheet/migrations/0011_auto__del_field_projectsheetquestion_template.py new file mode 100644 index 0000000..bcd1771 --- /dev/null +++ b/projectsheet/migrations/0011_auto__del_field_projectsheetquestion_template.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'ProjectSheetQuestion.template' + db.delete_column(u'projectsheet_projectsheetquestion', 'template_id') + + # Adding M2M table for field template on 'ProjectSheetQuestion' + m2m_table_name = db.shorten_name(u'projectsheet_projectsheetquestion_template') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('projectsheetquestion', models.ForeignKey(orm[u'projectsheet.projectsheetquestion'], null=False)), + ('projectsheettemplate', models.ForeignKey(orm[u'projectsheet.projectsheettemplate'], null=False)) + )) + db.create_unique(m2m_table_name, ['projectsheetquestion_id', 'projectsheettemplate_id']) + + + def backwards(self, orm): + # Adding field 'ProjectSheetQuestion.template' + db.add_column(u'projectsheet_projectsheetquestion', 'template', + self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='questions', to=orm['projectsheet.ProjectSheetTemplate']), + keep_default=False) + + # Removing M2M table for field template on 'ProjectSheetQuestion' + db.delete_table(db.shorten_name(u'projectsheet_projectsheetquestion_template')) + + + 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'auth.user': { + 'Meta': {'object_name': 'User'}, + '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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + 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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'bucket.bucket': { + 'Meta': {'object_name': 'Bucket'}, + 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buckets_created'", 'to': u"orm['auth.User']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'bucket.bucketfile': { + 'Meta': {'object_name': 'BucketFile'}, + 'being_edited_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editor_of'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'bucket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': u"orm['bucket.Bucket']"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'thumbnail_url': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'updated_on': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'uploader_of'", 'to': u"orm['auth.User']"}), + 'uploaded_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 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'projects.project': { + 'Meta': {'object_name': 'Project'}, + 'baseline': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'begin_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'created_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['scout.Place']", 'null': 'True', 'blank': 'True'}), + 'progress': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projects.ProjectProgress']", 'null': 'True', 'blank': 'True'}), + 'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': 'None', 'unique_with': '()'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'projects.projectprogress': { + 'Meta': {'ordering': "['order']", 'object_name': 'ProjectProgress'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '500'}), + 'icon': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'progress_range': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projects.ProjectProgressRange']"}) + }, + u'projects.projectprogressrange': { + 'Meta': {'object_name': 'ProjectProgressRange'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': "'name'", 'unique_with': '()'}) + }, + u'projectsheet.historicalprojectsheet': { + 'Meta': {'ordering': "(u'-history_date', u'-history_id')", 'object_name': 'HistoricalProjectSheet'}, + 'bucket_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'cover_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + u'history_date': ('django.db.models.fields.DateTimeField', [], {}), + u'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + u'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + u'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), + 'project_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'template_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'videos': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) + }, + u'projectsheet.projectsheet': { + 'Meta': {'object_name': 'ProjectSheet'}, + 'bucket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bucket.Bucket']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'cover': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'project_sheets_covered'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['bucket.BucketFile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'project': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['projects.Project']", 'unique': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['projectsheet.ProjectSheetTemplate']"}), + 'videos': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) + }, + u'projectsheet.projectsheetquestion': { + 'Meta': {'ordering': "('order',)", 'object_name': 'ProjectSheetQuestion'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'template': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'questions'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['projectsheet.ProjectSheetTemplate']"}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'projectsheet.projectsheetquestionanswer': { + 'Meta': {'ordering': "('question__order',)", 'object_name': 'ProjectSheetQuestionAnswer'}, + 'answer': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'projectsheet': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'question_answers'", 'to': u"orm['projectsheet.ProjectSheet']"}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': u"orm['projectsheet.ProjectSheetQuestion']"}), + 'selected_choices_id': ('jsonfield.fields.JSONField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) + }, + u'projectsheet.projectsheettemplate': { + 'Meta': {'object_name': 'ProjectSheetTemplate'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'shortdesc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': "'name'", 'unique_with': '()'}) + }, + u'projectsheet.questionchoice': { + 'Meta': {'object_name': 'QuestionChoice'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'question': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'choices'", 'to': u"orm['projectsheet.ProjectSheetQuestion']"}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'value': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'scout.place': { + 'Meta': {'object_name': 'Place'}, + 'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'place'", 'null': 'True', 'to': u"orm['scout.PostalAddress']"}), + 'geo': ('django.contrib.gis.db.models.fields.PointField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'scout.postaladdress': { + 'Meta': {'object_name': 'PostalAddress'}, + 'address_locality': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'address_region': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'post_office_box_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'street_address': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + } + } + + complete_apps = ['projectsheet'] \ No newline at end of file diff --git a/projectsheet/models.py b/projectsheet/models.py index 9a0777f..0632736 100644 --- a/projectsheet/models.py +++ b/projectsheet/models.py @@ -15,13 +15,14 @@ class ProjectSheetTemplate(models.Model): name = models.CharField(max_length=100) slug = AutoSlugField(unique=True, populate_from="name", always_update=True) shortdesc = models.CharField(max_length=255, null=True, blank=True) + #questions = models.ManyToManyField("projectsheet.models.ProjectSheetQuestion", related_name='template') def __unicode__(self): return self.name class ProjectSheetQuestion(models.Model): - template = models.ForeignKey(ProjectSheetTemplate, related_name='questions') + template = models.ManyToManyField(ProjectSheetTemplate, related_name='questions', null=True, blank=True) order = models.PositiveIntegerField(default=0) text = models.CharField(max_length=255)