From 5c563ff1701456a2ca7108a301e4e48457475daa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Perrin?= Date: Mon, 31 Oct 2016 01:21:54 +0000 Subject: [PATCH] Use django-tagging for tags --- djsite/settings.py | 5 +- quotes/admin.py | 14 ++++- quotes/localmodels.py | 7 +++ quotes/migrations/0001_initial.py | 56 ++++++++++--------- ...t_author.py => 0002_auto_20161031_0033.py} | 10 ++-- quotes/migrations/0003_auto_20161009_2254.py | 42 -------------- quotes/migrations/0003_auto_20161031_0034.py | 20 +++++++ quotes/migrations/0004_auto_20161009_2255.py | 19 ------- quotes/migrations/0004_auto_20161031_0036.py | 26 +++++++++ quotes/migrations/0005_auto_20161031_0052.py | 54 ++++++++++++++++++ quotes/migrations/0006_auto_20161031_0055.py | 25 +++++++++ quotes/migrations/0007_auto_20161031_0056.py | 20 +++++++ quotes/models.py | 13 ++--- quotes/views.py | 2 +- 14 files changed, 207 insertions(+), 106 deletions(-) rename quotes/migrations/{0002_context_author.py => 0002_auto_20161031_0033.py} (55%) delete mode 100644 quotes/migrations/0003_auto_20161009_2254.py create mode 100644 quotes/migrations/0003_auto_20161031_0034.py delete mode 100644 quotes/migrations/0004_auto_20161009_2255.py create mode 100644 quotes/migrations/0004_auto_20161031_0036.py create mode 100644 quotes/migrations/0005_auto_20161031_0052.py create mode 100644 quotes/migrations/0006_auto_20161031_0055.py create mode 100644 quotes/migrations/0007_auto_20161031_0056.py diff --git a/djsite/settings.py b/djsite/settings.py index f8a0605..4c0385e 100644 --- a/djsite/settings.py +++ b/djsite/settings.py @@ -25,8 +25,7 @@ SECRET_KEY = 's665xl1i*aa@k@-!3xnga&qf47^hl*g9z7z7r51e_3*5vqi7=m' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] - +ALLOWED_HOSTS = ['quotes.fperrin.net'] # Application definition @@ -37,6 +36,7 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'tagging', 'tinymce', 'quotes', ) @@ -97,6 +97,7 @@ USE_L10N = True USE_TZ = True +USE_X_FORWARDED_HOST = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ diff --git a/quotes/admin.py b/quotes/admin.py index 7e8f1ad..9617bc7 100644 --- a/quotes/admin.py +++ b/quotes/admin.py @@ -1,8 +1,16 @@ +from django import forms from django.contrib import admin # Register your models here. -from .models import Tag, Author, Work, Quote -admin.site.register(Tag) -admin.site.register(Author) +from .models import Author, Work, Quote +#admin.site.register(Tag) admin.site.register(Work) admin.site.register(Quote) + +class AuthorForm(forms.ModelForm): +# taggit = TagField(required=False, widget=LabelWidget) + pass + +class AuthorAdmin(admin.ModelAdmin): + form = AuthorForm +admin.site.register(Author, AuthorAdmin) diff --git a/quotes/localmodels.py b/quotes/localmodels.py index afe874a..0cbb376 100644 --- a/quotes/localmodels.py +++ b/quotes/localmodels.py @@ -10,3 +10,10 @@ class HTMLField(tinymce.models.HTMLField): safe_value = valid_html(value) setattr(model_instance, self.attname, safe_value) return safe_value + +import tagging.fields + +class TagField(tagging.fields.TagField): + def __init__(self, *args, **kwargs): + kwargs.setdefault('help_text', 'Space-separated list of tags') + return tagging.fields.TagField.__init__(self, *args, **kwargs) diff --git a/quotes/migrations/0001_initial.py b/quotes/migrations/0001_initial.py index c7f97c4..927cce9 100644 --- a/quotes/migrations/0001_initial.py +++ b/quotes/migrations/0001_initial.py @@ -1,11 +1,16 @@ # -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:22 from __future__ import unicode_literals from django.db import migrations, models +import django.db.models.deletion +import quotes.localmodels class Migration(migrations.Migration): + initial = True + dependencies = [ ] @@ -13,54 +18,55 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Author', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text=b'Name of the author', max_length=100)), - ('notes', models.TextField(help_text=b'Notes about the author; may be left blank. Will not be HTML-escaped.', blank=True)), - ('pvt_notes', models.TextField(help_text=b'Notes about the author; not displayed on the public interface', blank=True)), - ('birth_date', models.DateField(help_text=b'Date of birth', null=True, blank=True)), - ('death_date', models.DateField(help_text=b'Date of death (leave blank if still alive!)', null=True, blank=True)), + ('notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the author; may be left blank. Will not be HTML-escaped.')), + ('pvt_notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the author; not displayed on the public interface')), + ('birth_date', models.DateField(blank=True, help_text=b'Date of birth', null=True)), + ('death_date', models.DateField(blank=True, help_text=b'Date of death (leave blank if still alive!)', null=True)), ], ), migrations.CreateModel( - name='Context', + name='Quote', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(help_text=b'Name of the context for the quote (title of the work or speech it appears in)', max_length=100)), - ('date', models.DateField(help_text=b'Date of the quote', null=True, blank=True)), - ('notes', models.TextField(help_text=b'Notes about the work; may be left blank. Will not be HTML-escaped. XXX: offer a WYSIWYG editor', blank=True)), - ('pvt_notes', models.TextField(help_text=b'Notes about the work; not displayed on the public interface', blank=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', quotes.localmodels.HTMLField()), + ('notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the quote; may be left blank. Will not be HTML-escaped. XXX: offer a WYSIWYG editor')), + ('pvt_notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the quote; not displayed on the public interface')), ], ), migrations.CreateModel( - name='Quote', + name='Tag', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('text', models.TextField()), - ('notes', models.TextField(help_text=b'Notes about the quote; may be left blank. Will not be HTML-escaped. XXX: offer a WYSIWYG editor', blank=True)), - ('pvt_notes', models.TextField(help_text=b'Notes about the quote; not displayed on the public interface', blank=True)), - ('context', models.ForeignKey(to='quotes.Context')), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tag', models.CharField(max_length=100)), ], ), migrations.CreateModel( - name='Tag', + name='Work', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('tag', models.CharField(max_length=100)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text=b'Name of the context for the quote (title of the work or speech it appears in)', max_length=100)), + ('date', models.DateField(blank=True, help_text=b'Date of the quote', null=True)), + ('notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the work; may be left blank. Will not be HTML-escaped. XXX: offer a WYSIWYG editor')), + ('pvt_notes', quotes.localmodels.HTMLField(blank=True, help_text=b'Notes about the work; not displayed on the public interface')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quotes.Author')), + ('tags', models.ManyToManyField(blank=True, to='quotes.Tag')), ], ), migrations.AddField( model_name='quote', name='tags', - field=models.ManyToManyField(to='quotes.Tag', blank=True), + field=models.ManyToManyField(blank=True, to='quotes.Tag'), ), migrations.AddField( - model_name='context', - name='tags', - field=models.ManyToManyField(to='quotes.Tag', blank=True), + model_name='quote', + name='work', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quotes.Work'), ), migrations.AddField( model_name='author', name='tags', - field=models.ManyToManyField(to='quotes.Tag', blank=True), + field=models.ManyToManyField(blank=True, to='quotes.Tag'), ), ] diff --git a/quotes/migrations/0002_context_author.py b/quotes/migrations/0002_auto_20161031_0033.py similarity index 55% rename from quotes/migrations/0002_context_author.py rename to quotes/migrations/0002_auto_20161031_0033.py index 79ca5e3..f83d287 100644 --- a/quotes/migrations/0002_context_author.py +++ b/quotes/migrations/0002_auto_20161031_0033.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:33 from __future__ import unicode_literals from django.db import migrations, models @@ -11,10 +12,9 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AddField( - model_name='context', - name='author', - field=models.ForeignKey(default=1, to='quotes.Author'), - preserve_default=False, + migrations.AlterField( + model_name='author', + name='tags', + field=models.ManyToManyField(to='quotes.Tag'), ), ] diff --git a/quotes/migrations/0003_auto_20161009_2254.py b/quotes/migrations/0003_auto_20161009_2254.py deleted file mode 100644 index b3b0366..0000000 --- a/quotes/migrations/0003_auto_20161009_2254.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('quotes', '0002_context_author'), - ] - - operations = [ - migrations.CreateModel( - name='Work', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(help_text=b'Name of the context for the quote (title of the work or speech it appears in)', max_length=100)), - ('date', models.DateField(help_text=b'Date of the quote', null=True, blank=True)), - ('notes', models.TextField(help_text=b'Notes about the work; may be left blank. Will not be HTML-escaped. XXX: offer a WYSIWYG editor', blank=True)), - ('pvt_notes', models.TextField(help_text=b'Notes about the work; not displayed on the public interface', blank=True)), - ('author', models.ForeignKey(to='quotes.Author')), - ('tags', models.ManyToManyField(to='quotes.Tag', blank=True)), - ], - ), - migrations.RemoveField( - model_name='context', - name='author', - ), - migrations.RemoveField( - model_name='context', - name='tags', - ), - migrations.AlterField( - model_name='quote', - name='context', - field=models.ForeignKey(to='quotes.Work'), - ), - migrations.DeleteModel( - name='Context', - ), - ] diff --git a/quotes/migrations/0003_auto_20161031_0034.py b/quotes/migrations/0003_auto_20161031_0034.py new file mode 100644 index 0000000..baab095 --- /dev/null +++ b/quotes/migrations/0003_auto_20161031_0034.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:34 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('quotes', '0002_auto_20161031_0033'), + ] + + operations = [ + migrations.AlterField( + model_name='author', + name='tags', + field=models.ManyToManyField(blank=True, to='quotes.Tag'), + ), + ] diff --git a/quotes/migrations/0004_auto_20161009_2255.py b/quotes/migrations/0004_auto_20161009_2255.py deleted file mode 100644 index cf435ab..0000000 --- a/quotes/migrations/0004_auto_20161009_2255.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('quotes', '0003_auto_20161009_2254'), - ] - - operations = [ - migrations.RenameField( - model_name='quote', - old_name='context', - new_name='work', - ), - ] diff --git a/quotes/migrations/0004_auto_20161031_0036.py b/quotes/migrations/0004_auto_20161031_0036.py new file mode 100644 index 0000000..2e67927 --- /dev/null +++ b/quotes/migrations/0004_auto_20161031_0036.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:36 +from __future__ import unicode_literals + +from django.db import migrations +import tagging.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('quotes', '0003_auto_20161031_0034'), + ] + + operations = [ + migrations.AddField( + model_name='author', + name='tagbis', + field=tagging.fields.TagField(blank=True, max_length=255), + ), + migrations.AddField( + model_name='work', + name='tagter', + field=tagging.fields.TagField(blank=True, max_length=255), + ), + ] diff --git a/quotes/migrations/0005_auto_20161031_0052.py b/quotes/migrations/0005_auto_20161031_0052.py new file mode 100644 index 0000000..ad509a7 --- /dev/null +++ b/quotes/migrations/0005_auto_20161031_0052.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:52 +from __future__ import unicode_literals + +from django.db import migrations +import quotes.localmodels + + +class Migration(migrations.Migration): + + dependencies = [ + ('quotes', '0004_auto_20161031_0036'), + ] + + operations = [ + migrations.RemoveField( + model_name='author', + name='tagbis', + ), + migrations.RemoveField( + model_name='work', + name='tagter', + ), + migrations.RemoveField( + model_name='author', + name='tags', + ), + migrations.AddField( + model_name='author', + name='tags', + field=quotes.localmodels.TagField(blank=True, max_length=255), + ), + migrations.RemoveField( + model_name='quote', + name='tags', + ), + migrations.AddField( + model_name='quote', + name='tags', + field=quotes.localmodels.TagField(blank=True, max_length=255), + ), + migrations.RemoveField( + model_name='work', + name='tags', + ), + migrations.AddField( + model_name='work', + name='tags', + field=quotes.localmodels.TagField(blank=True, max_length=255), + ), + migrations.DeleteModel( + name='Tag', + ), + ] diff --git a/quotes/migrations/0006_auto_20161031_0055.py b/quotes/migrations/0006_auto_20161031_0055.py new file mode 100644 index 0000000..047eed7 --- /dev/null +++ b/quotes/migrations/0006_auto_20161031_0055.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:55 +from __future__ import unicode_literals + +from django.db import migrations +import quotes.localmodels + + +class Migration(migrations.Migration): + + dependencies = [ + ('quotes', '0005_auto_20161031_0052'), + ] + + operations = [ + migrations.RemoveField( + model_name='author', + name='tags', + ), + migrations.AddField( + model_name='author', + name='tag', + field=quotes.localmodels.TagField(blank=True, max_length=255), + ), + ] diff --git a/quotes/migrations/0007_auto_20161031_0056.py b/quotes/migrations/0007_auto_20161031_0056.py new file mode 100644 index 0000000..c01a8a4 --- /dev/null +++ b/quotes/migrations/0007_auto_20161031_0056.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-31 00:56 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('quotes', '0006_auto_20161031_0055'), + ] + + operations = [ + migrations.RenameField( + model_name='author', + old_name='tag', + new_name='tags', + ), + ] diff --git a/quotes/models.py b/quotes/models.py index 0fa66af..7539152 100644 --- a/quotes/models.py +++ b/quotes/models.py @@ -1,12 +1,7 @@ from django.db import models -from localmodels import HTMLField +from localmodels import HTMLField, TagField # Create your models here. -class Tag(models.Model): - tag = models.CharField(max_length=100) - def __unicode__(self): - return self.tag - class Author(models.Model): name = models.CharField(max_length=100, help_text="Name of the author") @@ -16,7 +11,7 @@ class Author(models.Model): pvt_notes = HTMLField(blank=True, help_text= \ "Notes about the author; not displayed on \ the public interface",) - tags = models.ManyToManyField(Tag, blank=True) + tags = TagField() birth_date = models.DateField(blank=True, null=True, help_text="Date of birth") @@ -53,7 +48,7 @@ class Work(models.Model): author = models.ForeignKey(Author) date = models.DateField(blank=True, null=True, help_text="Date of the quote") - tags = models.ManyToManyField(Tag, blank=True) + tags = TagField() notes = HTMLField(blank=True, help_text= \ "Notes about the work; may be left blank. Will \ @@ -67,7 +62,7 @@ class Work(models.Model): class Quote(models.Model): text = HTMLField() - tags = models.ManyToManyField(Tag, blank=True) + tags = TagField() work = models.ForeignKey(Work) notes = HTMLField(blank=True, help_text= \ diff --git a/quotes/views.py b/quotes/views.py index df4081d..002c4e3 100644 --- a/quotes/views.py +++ b/quotes/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render from random import randint -from .models import Author, Work, Quote, Tag +from .models import Author, Work, Quote # Create your views here. def onequote(request, quote_id): -- 2.43.0