diff --git a/0001_initial.py b/0001_initial.py new file mode 100644 index 0000000..e5e0784 --- /dev/null +++ b/0001_initial.py @@ -0,0 +1,545 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + +# created by +# $ python manage.py makemigrations core +# in troggle/core/migrations/0001_initial.py + +# Useful shorthand for db structure + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Area', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('short_name', models.CharField(max_length=100)), + ('name', models.CharField(max_length=200, blank=True, null=True)), + ('description', models.TextField(blank=True, null=True)), + ('parent', models.ForeignKey(blank=True, null=True, to='core.Area')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Cave', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('official_name', models.CharField(max_length=160)), + ('kataster_code', models.CharField(max_length=20, blank=True, null=True)), + ('kataster_number', models.CharField(max_length=10, blank=True, null=True)), + ('unofficial_number', models.CharField(max_length=60, blank=True, null=True)), + ('explorers', models.TextField(blank=True, null=True)), + ('underground_description', models.TextField(blank=True, null=True)), + ('equipment', models.TextField(blank=True, null=True)), + ('references', models.TextField(blank=True, null=True)), + ('survey', models.TextField(blank=True, null=True)), + ('kataster_status', models.TextField(blank=True, null=True)), + ('underground_centre_line', models.TextField(blank=True, null=True)), + ('notes', models.TextField(blank=True, null=True)), + ('length', models.CharField(max_length=100, blank=True, null=True)), + ('depth', models.CharField(max_length=100, blank=True, null=True)), + ('extent', models.CharField(max_length=100, blank=True, null=True)), + ('survex_file', models.CharField(max_length=100, blank=True, null=True)), + ('description_file', models.CharField(max_length=200, blank=True, null=True)), + ('url', models.CharField(max_length=200, blank=True, null=True)), + ('filename', models.CharField(max_length=200)), + ('area', models.ManyToManyField(blank=True, null=True, to='core.Area')), + ], + options={ + 'ordering': ('kataster_code', 'unofficial_number'), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='CaveAndEntrance', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('entrance_letter', models.CharField(max_length=20, blank=True, null=True)), + ('cave', models.ForeignKey(to='core.Cave')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='CaveDescription', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('short_name', models.CharField(max_length=50, unique=True)), + ('long_name', models.CharField(max_length=200, blank=True, null=True)), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='CaveSlug', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('slug', models.SlugField(unique=True)), + ('primary', models.BooleanField(default=False)), + ('cave', models.ForeignKey(to='core.Cave')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='DataIssue', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateTimeField(auto_now_add=True)), + ('parser', models.CharField(max_length=50, blank=True, null=True)), + ('message', models.CharField(max_length=400, blank=True, null=True)), + ], + options={ + 'ordering': ['date'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Entrance', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(max_length=100, blank=True, null=True)), + ('entrance_description', models.TextField(blank=True, null=True)), + ('explorers', models.TextField(blank=True, null=True)), + ('map_description', models.TextField(blank=True, null=True)), + ('location_description', models.TextField(blank=True, null=True)), + ('approach', models.TextField(blank=True, null=True)), + ('underground_description', models.TextField(blank=True, null=True)), + ('photo', models.TextField(blank=True, null=True)), + ('marking', models.CharField(max_length=2, choices=[('P', 'Paint'), ('P?', 'Paint (?)'), ('T', 'Tag'), ('T?', 'Tag (?)'), ('R', 'Needs Retag'), ('S', 'Spit'), ('S?', 'Spit (?)'), ('U', 'Unmarked'), ('?', 'Unknown')])), + ('marking_comment', models.TextField(blank=True, null=True)), + ('findability', models.CharField(max_length=1, blank=True, null=True, choices=[('?', 'To be confirmed ...'), ('S', 'Coordinates'), ('L', 'Lost'), ('R', 'Refindable')])), + ('findability_description', models.TextField(blank=True, null=True)), + ('alt', models.TextField(blank=True, null=True)), + ('northing', models.TextField(blank=True, null=True)), + ('easting', models.TextField(blank=True, null=True)), + ('tag_station', models.TextField(blank=True, null=True)), + ('exact_station', models.TextField(blank=True, null=True)), + ('other_station', models.TextField(blank=True, null=True)), + ('other_description', models.TextField(blank=True, null=True)), + ('bearings', models.TextField(blank=True, null=True)), + ('url', models.CharField(max_length=200, blank=True, null=True)), + ('filename', models.CharField(max_length=200)), + ('cached_primary_slug', models.CharField(max_length=200, blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='EntranceSlug', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('slug', models.SlugField(unique=True)), + ('primary', models.BooleanField(default=False)), + ('entrance', models.ForeignKey(to='core.Entrance')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Expedition', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('year', models.CharField(max_length=20, unique=True)), + ('name', models.CharField(max_length=100)), + ], + options={ + 'ordering': ('-year',), + 'get_latest_by': 'year', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ExpeditionDay', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateField()), + ('expedition', models.ForeignKey(to='core.Expedition')), + ], + options={ + 'ordering': ('date',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='LogbookEntry', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateField()), + ('title', models.CharField(max_length=200)), + ('cave_slug', models.SlugField()), + ('place', models.CharField(max_length=100, blank=True, null=True, help_text="Only use this if you haven't chosen a cave")), + ('text', models.TextField()), + ('slug', models.SlugField()), + ('filename', models.CharField(max_length=200, null=True)), + ('entry_type', models.CharField(max_length=50, null=True, default='wiki', choices=[('wiki', 'Wiki style logbook'), ('html', 'Html style logbook')])), + ('expedition', models.ForeignKey(blank=True, null=True, to='core.Expedition')), + ('expeditionday', models.ForeignKey(null=True, to='core.ExpeditionDay')), + ], + options={ + 'verbose_name_plural': 'Logbook Entries', + 'ordering': ('-date',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='NewSubCave', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, unique=True)), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='OtherCaveName', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(max_length=160)), + ('cave', models.ForeignKey(to='core.Cave')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('first_name', models.CharField(max_length=100)), + ('last_name', models.CharField(max_length=100)), + ('fullname', models.CharField(max_length=200)), + ('is_vfho', models.BooleanField(default=False, help_text='VFHO is the Vereines für Höhlenkunde in Obersteier, a nearby Austrian caving club.')), + ('mug_shot', models.CharField(max_length=100, blank=True, null=True)), + ('blurb', models.TextField(blank=True, null=True)), + ('orderref', models.CharField(max_length=200)), + ('user', models.OneToOneField(blank=True, null=True, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'People', + 'ordering': ('orderref',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='PersonExpedition', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('slugfield', models.SlugField(blank=True, null=True)), + ('is_guest', models.BooleanField(default=False)), + ('expo_committee_position', models.CharField(max_length=200, blank=True, null=True, choices=[('leader', 'Expo leader'), ('medical', 'Expo medical officer'), ('treasurer', 'Expo treasurer'), ('sponsorship', 'Expo sponsorship coordinator'), ('research', 'Expo research coordinator')])), + ('nickname', models.CharField(max_length=100, blank=True, null=True)), + ('expedition', models.ForeignKey(to='core.Expedition')), + ('person', models.ForeignKey(to='core.Person')), + ], + options={ + 'ordering': ('-expedition',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='PersonTrip', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('time_underground', models.FloatField(help_text='In decimal hours')), + ('is_logbook_entry_author', models.BooleanField(default=False)), + ('logbook_entry', models.ForeignKey(to='core.LogbookEntry')), + ('personexpedition', models.ForeignKey(null=True, to='core.PersonExpedition')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='QM', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('number', models.IntegerField(help_text='this is the sequential number in the year')), + ('grade', models.CharField(max_length=1, choices=[('A', 'A: Large obvious lead'), ('B', 'B: Average lead'), ('C', 'C: Tight unpromising lead'), ('D', 'D: Dig'), ('X', 'X: Unclimbable aven')])), + ('location_description', models.TextField(blank=True)), + ('nearest_station_description', models.CharField(max_length=400, blank=True, null=True)), + ('nearest_station_name', models.CharField(max_length=200, blank=True, null=True)), + ('area', models.CharField(max_length=100, blank=True, null=True)), + ('completion_description', models.TextField(blank=True, null=True)), + ('comment', models.TextField(blank=True, null=True)), + ('found_by', models.ForeignKey(blank=True, null=True, related_name='QMs_found', to='core.LogbookEntry')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexBlock', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('name', models.CharField(max_length=100)), + ('text', models.TextField()), + ('date', models.DateField(blank=True, null=True)), + ('begin_char', models.IntegerField()), + ('survexpath', models.CharField(max_length=200)), + ('totalleglength', models.FloatField()), + ('cave', models.ForeignKey(blank=True, null=True, to='core.Cave')), + ('expedition', models.ForeignKey(blank=True, null=True, to='core.Expedition')), + ('expeditionday', models.ForeignKey(null=True, to='core.ExpeditionDay')), + ('parent', models.ForeignKey(blank=True, null=True, to='core.SurvexBlock')), + ], + options={ + 'ordering': ('id',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexDirectory', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('path', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, to='core.Cave')), + ], + options={ + 'ordering': ('id',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexEquate', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('cave', models.ForeignKey(blank=True, null=True, to='core.Cave')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexFile', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('path', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, to='core.Cave')), + ('survexdirectory', models.ForeignKey(blank=True, null=True, to='core.SurvexDirectory')), + ], + options={ + 'ordering': ('id',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexLeg', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('tape', models.FloatField()), + ('compass', models.FloatField()), + ('clino', models.FloatField()), + ('block', models.ForeignKey(to='core.SurvexBlock')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexPersonRole', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('nrole', models.CharField(max_length=200, blank=True, null=True, choices=[('insts', 'Instruments'), ('dog', 'Other'), ('notes', 'Notes'), ('pics', 'Pictures'), ('tape', 'Tape measure'), ('useless', 'Useless'), ('helper', 'Helper'), ('disto', 'Disto'), ('consultant', 'Consultant')])), + ('personname', models.CharField(max_length=100)), + ('expeditionday', models.ForeignKey(null=True, to='core.ExpeditionDay')), + ('person', models.ForeignKey(blank=True, null=True, to='core.Person')), + ('personexpedition', models.ForeignKey(blank=True, null=True, to='core.PersonExpedition')), + ('persontrip', models.ForeignKey(blank=True, null=True, to='core.PersonTrip')), + ('survexblock', models.ForeignKey(to='core.SurvexBlock')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexScansFolder', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('fpath', models.CharField(max_length=200)), + ('walletname', models.CharField(max_length=200)), + ], + options={ + 'ordering': ('walletname',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexScanSingle', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('ffile', models.CharField(max_length=200)), + ('name', models.CharField(max_length=200)), + ('survexscansfolder', models.ForeignKey(null=True, to='core.SurvexScansFolder')), + ], + options={ + 'ordering': ('name',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexStation', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('name', models.CharField(max_length=100)), + ('x', models.FloatField(blank=True, null=True)), + ('y', models.FloatField(blank=True, null=True)), + ('z', models.FloatField(blank=True, null=True)), + ('block', models.ForeignKey(to='core.SurvexBlock')), + ('equate', models.ForeignKey(blank=True, null=True, to='core.SurvexEquate')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SurvexTitle', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('title', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, to='core.Cave')), + ('survexblock', models.ForeignKey(to='core.SurvexBlock')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TunnelFile', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('tunnelpath', models.CharField(max_length=200)), + ('tunnelname', models.CharField(max_length=200)), + ('bfontcolours', models.BooleanField(default=False)), + ('filesize', models.IntegerField(default=0)), + ('npaths', models.IntegerField(default=0)), + ('survexblocks', models.ManyToManyField(to='core.SurvexBlock')), + ('survexscans', models.ManyToManyField(to='core.SurvexScanSingle')), + ('survexscansfolders', models.ManyToManyField(to='core.SurvexScansFolder')), + ('survextitles', models.ManyToManyField(to='core.SurvexTitle')), + ('tunnelcontains', models.ManyToManyField(to='core.TunnelFile')), + ], + options={ + 'ordering': ('tunnelpath',), + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='survexleg', + name='stationfrom', + field=models.ForeignKey(related_name='stationfrom', to='core.SurvexStation'), + preserve_default=True, + ), + migrations.AddField( + model_name='survexleg', + name='stationto', + field=models.ForeignKey(related_name='stationto', to='core.SurvexStation'), + preserve_default=True, + ), + migrations.AddField( + model_name='survexdirectory', + name='primarysurvexfile', + field=models.ForeignKey(blank=True, null=True, related_name='primarysurvexfile', to='core.SurvexFile'), + preserve_default=True, + ), + migrations.AddField( + model_name='survexblock', + name='survexfile', + field=models.ForeignKey(blank=True, null=True, to='core.SurvexFile'), + preserve_default=True, + ), + migrations.AddField( + model_name='survexblock', + name='survexscansfolder', + field=models.ForeignKey(null=True, to='core.SurvexScansFolder'), + preserve_default=True, + ), + migrations.AddField( + model_name='qm', + name='nearest_station', + field=models.ForeignKey(blank=True, null=True, to='core.SurvexStation'), + preserve_default=True, + ), + migrations.AddField( + model_name='qm', + name='ticked_off_by', + field=models.ForeignKey(blank=True, null=True, related_name='QMs_ticked_off', to='core.LogbookEntry'), + preserve_default=True, + ), + migrations.AddField( + model_name='cavedescription', + name='linked_entrances', + field=models.ManyToManyField(blank=True, null=True, to='core.Entrance'), + preserve_default=True, + ), + migrations.AddField( + model_name='cavedescription', + name='linked_qms', + field=models.ManyToManyField(blank=True, null=True, to='core.QM'), + preserve_default=True, + ), + migrations.AddField( + model_name='cavedescription', + name='linked_subcaves', + field=models.ManyToManyField(blank=True, null=True, to='core.NewSubCave'), + preserve_default=True, + ), + migrations.AddField( + model_name='caveandentrance', + name='entrance', + field=models.ForeignKey(to='core.Entrance'), + preserve_default=True, + ), + ] diff --git a/README.txt b/README.txt index c61e08d..ca5646b 100644 --- a/README.txt +++ b/README.txt @@ -51,12 +51,12 @@ Follow the instructions contained in the file to fill out your settings. Python3, Django, and Database setup ----------------------------------- -Troggle with python3 requires Django 1.7 . -It is currently (May 2020) on django 1.7.11 (1.7.11-1+deb8u5). +Troggle with python3 requires Django 1.8.19 (16 June 2019) +For Django 1.19 see below. Read this: https://docs.djangoproject.com/en/3.0/topics/install/ -We are installing with python3. +We are installing with python3.7.7 or 3.8.1 [ If you want to use python2.7 you presumably can work it out for yourself. You should look at past revisions of this file in git to see what is required. Also : https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/ ] @@ -73,13 +73,13 @@ $ sudo apt install python3-pip Now install django etc. $ sudo pip3 install -r requirements.txt -where requirements.txt is: -Django==1.7 +where requirementsworks1.8.19.txt is: +Django==1.8.19 django-extensions==2.2.9 django-registration==2.0 -django-tinymce==2.0.1 Pillow==7.1.2 -six==1.14.0 +six==1.15.0 +sqlparse==0.3.1 Unidecode==1.1.1 if you don't use sudo it will install them all in ~/.local/ @@ -91,7 +91,7 @@ and Pillow is an image handling package used to make the prospecting map. tinymce is the wysiwyg in-browser editor. -$ pip3 list +$ pip3 list -o will list all the pip python packages installed. [NB we should test whether later verisons of tinymce work.] @@ -123,17 +123,14 @@ copy this over the installed version of django on your machine: $ cd troggle $ sudo cp django-patch/html_parser.py /usr/local/lib/python3.8/dist-packages/django/utils/ - -or, if you have django installed by person arthe rthan by system: -$ sudo cp django-patch/html_parser.py /home/philip/.local/lib/python3.8/site-packages/django/utils/ or $ cp django-patch/html_parser.py ~/.local/lib/python3.8/site-packages/django/utils/ if you didn't use sudo when installing everything using pip. or if you are using a venv, and you are using python3.7 in it, then -$ cd -$ cp /django-patch/html_parser.py lib/python3.7/site-packages/django/utils/html_parser.py +$ cd /troggle +$ cp django-patch/html_parser.py lib/python3.7/site-packages/django/utils/html_parser.py that's it. Testing the django installation @@ -197,6 +194,19 @@ then the settings registration of troggle with django is incomplete. Delete all your cached .pyc files and try again. You probably have a mistake in your settings.py or localsettings.py files. +Django 1.9.13 +------------- +Works fine, but creating a new,clean database does nopt happen automatically +when you run databaseReset.py. Instead you have to do this: + +python manage.py makemigrations core +python manage.py makemigrations flatpages +python manage.py migrate +python manage.py migrate core +python manage.py migrate flatpages +python databaseReset.py reset + + Setting up survex ----------------- You need to have survex installed as the command line tools 'cavern' and '3dtopos' are diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..ef8737e --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,470 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2020-06-16 23:22 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Area', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('short_name', models.CharField(max_length=100)), + ('name', models.CharField(blank=True, max_length=200, null=True)), + ('description', models.TextField(blank=True, null=True)), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Area')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Cave', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('official_name', models.CharField(max_length=160)), + ('kataster_code', models.CharField(blank=True, max_length=20, null=True)), + ('kataster_number', models.CharField(blank=True, max_length=10, null=True)), + ('unofficial_number', models.CharField(blank=True, max_length=60, null=True)), + ('explorers', models.TextField(blank=True, null=True)), + ('underground_description', models.TextField(blank=True, null=True)), + ('equipment', models.TextField(blank=True, null=True)), + ('references', models.TextField(blank=True, null=True)), + ('survey', models.TextField(blank=True, null=True)), + ('kataster_status', models.TextField(blank=True, null=True)), + ('underground_centre_line', models.TextField(blank=True, null=True)), + ('notes', models.TextField(blank=True, null=True)), + ('length', models.CharField(blank=True, max_length=100, null=True)), + ('depth', models.CharField(blank=True, max_length=100, null=True)), + ('extent', models.CharField(blank=True, max_length=100, null=True)), + ('survex_file', models.CharField(blank=True, max_length=100, null=True)), + ('description_file', models.CharField(blank=True, max_length=200, null=True)), + ('url', models.CharField(blank=True, max_length=200, null=True)), + ('filename', models.CharField(max_length=200)), + ('area', models.ManyToManyField(blank=True, to='core.Area')), + ], + options={ + 'ordering': ('kataster_code', 'unofficial_number'), + }, + ), + migrations.CreateModel( + name='CaveAndEntrance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entrance_letter', models.CharField(blank=True, max_length=20, null=True)), + ('cave', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ], + ), + migrations.CreateModel( + name='CaveDescription', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('short_name', models.CharField(max_length=50, unique=True)), + ('long_name', models.CharField(blank=True, max_length=200, null=True)), + ('description', models.TextField(blank=True, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CaveSlug', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.SlugField(unique=True)), + ('primary', models.BooleanField(default=False)), + ('cave', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ], + ), + migrations.CreateModel( + name='DataIssue', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateTimeField(auto_now_add=True)), + ('parser', models.CharField(blank=True, max_length=50, null=True)), + ('message', models.CharField(blank=True, max_length=400, null=True)), + ], + options={ + 'ordering': ['date'], + }, + ), + migrations.CreateModel( + name='Entrance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(blank=True, max_length=100, null=True)), + ('entrance_description', models.TextField(blank=True, null=True)), + ('explorers', models.TextField(blank=True, null=True)), + ('map_description', models.TextField(blank=True, null=True)), + ('location_description', models.TextField(blank=True, null=True)), + ('approach', models.TextField(blank=True, null=True)), + ('underground_description', models.TextField(blank=True, null=True)), + ('photo', models.TextField(blank=True, null=True)), + ('marking', models.CharField(choices=[('P', 'Paint'), ('P?', 'Paint (?)'), ('T', 'Tag'), ('T?', 'Tag (?)'), ('R', 'Needs Retag'), ('S', 'Spit'), ('S?', 'Spit (?)'), ('U', 'Unmarked'), ('?', 'Unknown')], max_length=2)), + ('marking_comment', models.TextField(blank=True, null=True)), + ('findability', models.CharField(blank=True, choices=[('?', 'To be confirmed ...'), ('S', 'Coordinates'), ('L', 'Lost'), ('R', 'Refindable')], max_length=1, null=True)), + ('findability_description', models.TextField(blank=True, null=True)), + ('alt', models.TextField(blank=True, null=True)), + ('northing', models.TextField(blank=True, null=True)), + ('easting', models.TextField(blank=True, null=True)), + ('tag_station', models.TextField(blank=True, null=True)), + ('exact_station', models.TextField(blank=True, null=True)), + ('other_station', models.TextField(blank=True, null=True)), + ('other_description', models.TextField(blank=True, null=True)), + ('bearings', models.TextField(blank=True, null=True)), + ('url', models.CharField(blank=True, max_length=200, null=True)), + ('filename', models.CharField(max_length=200)), + ('cached_primary_slug', models.CharField(blank=True, max_length=200, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='EntranceSlug', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.SlugField(unique=True)), + ('primary', models.BooleanField(default=False)), + ('entrance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Entrance')), + ], + ), + migrations.CreateModel( + name='Expedition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('year', models.CharField(max_length=20, unique=True)), + ('name', models.CharField(max_length=100)), + ], + options={ + 'ordering': ('-year',), + 'get_latest_by': 'year', + }, + ), + migrations.CreateModel( + name='ExpeditionDay', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateField()), + ('expedition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Expedition')), + ], + options={ + 'ordering': ('date',), + }, + ), + migrations.CreateModel( + name='LogbookEntry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('date', models.DateField()), + ('title', models.CharField(max_length=200)), + ('cave_slug', models.SlugField()), + ('place', models.CharField(blank=True, help_text="Only use this if you haven't chosen a cave", max_length=100, null=True)), + ('text', models.TextField()), + ('slug', models.SlugField()), + ('filename', models.CharField(max_length=200, null=True)), + ('entry_type', models.CharField(choices=[('wiki', 'Wiki style logbook'), ('html', 'Html style logbook')], default='wiki', max_length=50, null=True)), + ('expedition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Expedition')), + ('expeditionday', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.ExpeditionDay')), + ], + options={ + 'verbose_name_plural': 'Logbook Entries', + 'ordering': ('-date',), + }, + ), + migrations.CreateModel( + name='NewSubCave', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(max_length=200, unique=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='OtherCaveName', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('name', models.CharField(max_length=160)), + ('cave', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Person', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('first_name', models.CharField(max_length=100)), + ('last_name', models.CharField(max_length=100)), + ('fullname', models.CharField(max_length=200)), + ('is_vfho', models.BooleanField(default=False, help_text='VFHO is the Vereines für Höhlenkunde in Obersteier, a nearby Austrian caving club.')), + ('mug_shot', models.CharField(blank=True, max_length=100, null=True)), + ('blurb', models.TextField(blank=True, null=True)), + ('orderref', models.CharField(max_length=200)), + ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'People', + 'ordering': ('orderref',), + }, + ), + migrations.CreateModel( + name='PersonExpedition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('slugfield', models.SlugField(blank=True, null=True)), + ('is_guest', models.BooleanField(default=False)), + ('expo_committee_position', models.CharField(blank=True, choices=[('leader', 'Expo leader'), ('medical', 'Expo medical officer'), ('treasurer', 'Expo treasurer'), ('sponsorship', 'Expo sponsorship coordinator'), ('research', 'Expo research coordinator')], max_length=200, null=True)), + ('nickname', models.CharField(blank=True, max_length=100, null=True)), + ('expedition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Expedition')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Person')), + ], + options={ + 'ordering': ('-expedition',), + }, + ), + migrations.CreateModel( + name='PersonTrip', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('time_underground', models.FloatField(help_text='In decimal hours')), + ('is_logbook_entry_author', models.BooleanField(default=False)), + ('logbook_entry', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.LogbookEntry')), + ('personexpedition', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.PersonExpedition')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='QM', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('new_since_parsing', models.BooleanField(default=False, editable=False)), + ('non_public', models.BooleanField(default=False)), + ('number', models.IntegerField(help_text='this is the sequential number in the year')), + ('grade', models.CharField(choices=[('A', 'A: Large obvious lead'), ('B', 'B: Average lead'), ('C', 'C: Tight unpromising lead'), ('D', 'D: Dig'), ('X', 'X: Unclimbable aven')], max_length=1)), + ('location_description', models.TextField(blank=True)), + ('nearest_station_description', models.CharField(blank=True, max_length=400, null=True)), + ('nearest_station_name', models.CharField(blank=True, max_length=200, null=True)), + ('area', models.CharField(blank=True, max_length=100, null=True)), + ('completion_description', models.TextField(blank=True, null=True)), + ('comment', models.TextField(blank=True, null=True)), + ('found_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='QMs_found', to='core.LogbookEntry')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='SurvexBlock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('date', models.DateField(blank=True, null=True)), + ('survexpath', models.CharField(max_length=200)), + ('legsall', models.IntegerField(null=True)), + ('legssplay', models.IntegerField(null=True)), + ('legssurfc', models.IntegerField(null=True)), + ('totalleglength', models.FloatField(null=True)), + ('cave', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ('expedition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Expedition')), + ('expeditionday', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.ExpeditionDay')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexBlock')), + ], + options={ + 'ordering': ('id',), + }, + ), + migrations.CreateModel( + name='SurvexDirectory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('path', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ], + options={ + 'ordering': ('id',), + }, + ), + migrations.CreateModel( + name='SurvexEquate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cave', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ], + ), + migrations.CreateModel( + name='SurvexFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('path', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ('survexdirectory', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexDirectory')), + ], + options={ + 'ordering': ('id',), + }, + ), + migrations.CreateModel( + name='SurvexPersonRole', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nrole', models.CharField(blank=True, choices=[('insts', 'Instruments'), ('dog', 'Other'), ('notes', 'Notes'), ('pics', 'Pictures'), ('tape', 'Tape measure'), ('useless', 'Useless'), ('helper', 'Helper'), ('disto', 'Disto'), ('consultant', 'Consultant')], max_length=200, null=True)), + ('personname', models.CharField(max_length=100)), + ('expeditionday', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.ExpeditionDay')), + ('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Person')), + ('personexpedition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.PersonExpedition')), + ('persontrip', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.PersonTrip')), + ('survexblock', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.SurvexBlock')), + ], + ), + migrations.CreateModel( + name='SurvexScansFolder', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fpath', models.CharField(max_length=200)), + ('walletname', models.CharField(max_length=200)), + ], + options={ + 'ordering': ('walletname',), + }, + ), + migrations.CreateModel( + name='SurvexScanSingle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ffile', models.CharField(max_length=200)), + ('name', models.CharField(max_length=200)), + ('survexscansfolder', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexScansFolder')), + ], + options={ + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='SurvexStation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('x', models.FloatField(blank=True, null=True)), + ('y', models.FloatField(blank=True, null=True)), + ('z', models.FloatField(blank=True, null=True)), + ('block', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.SurvexBlock')), + ('equate', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexEquate')), + ], + ), + migrations.CreateModel( + name='SurvexTitle', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('cave', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Cave')), + ('survexblock', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.SurvexBlock')), + ], + ), + migrations.CreateModel( + name='TunnelFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tunnelpath', models.CharField(max_length=200)), + ('tunnelname', models.CharField(max_length=200)), + ('bfontcolours', models.BooleanField(default=False)), + ('filesize', models.IntegerField(default=0)), + ('npaths', models.IntegerField(default=0)), + ('survexblocks', models.ManyToManyField(to='core.SurvexBlock')), + ('survexscans', models.ManyToManyField(to='core.SurvexScanSingle')), + ('survexscansfolders', models.ManyToManyField(to='core.SurvexScansFolder')), + ('survextitles', models.ManyToManyField(to='core.SurvexTitle')), + ('tunnelcontains', models.ManyToManyField(to='core.TunnelFile')), + ], + options={ + 'ordering': ('tunnelpath',), + }, + ), + migrations.AddField( + model_name='survexdirectory', + name='primarysurvexfile', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='primarysurvexfile', to='core.SurvexFile'), + ), + migrations.AddField( + model_name='survexblock', + name='survexfile', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexFile'), + ), + migrations.AddField( + model_name='survexblock', + name='survexscansfolder', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexScansFolder'), + ), + migrations.AddField( + model_name='qm', + name='nearest_station', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='core.SurvexStation'), + ), + migrations.AddField( + model_name='qm', + name='ticked_off_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='QMs_ticked_off', to='core.LogbookEntry'), + ), + migrations.AddField( + model_name='cavedescription', + name='linked_entrances', + field=models.ManyToManyField(blank=True, to='core.Entrance'), + ), + migrations.AddField( + model_name='cavedescription', + name='linked_qms', + field=models.ManyToManyField(blank=True, to='core.QM'), + ), + migrations.AddField( + model_name='cavedescription', + name='linked_subcaves', + field=models.ManyToManyField(blank=True, to='core.NewSubCave'), + ), + migrations.AddField( + model_name='caveandentrance', + name='entrance', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Entrance'), + ), + ] diff --git a/core/migrations/__init__.py b/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/flatpages/migrations/0001_initial.py b/flatpages/migrations/0001_initial.py new file mode 100644 index 0000000..7b05ab8 --- /dev/null +++ b/flatpages/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2020-06-16 23:46 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='EntranceRedirect', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('originalURL', models.CharField(max_length=200)), + ('entrance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Entrance')), + ], + ), + migrations.CreateModel( + name='Redirect', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('originalURL', models.CharField(max_length=200, unique=True)), + ('newURL', models.CharField(max_length=200)), + ], + ), + ] diff --git a/flatpages/migrations/__init__.py b/flatpages/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements-rough1.9.13.txt b/requirements-rough1.9.13.txt new file mode 100644 index 0000000..4c7603e --- /dev/null +++ b/requirements-rough1.9.13.txt @@ -0,0 +1,7 @@ +Django==1.9.13 +django-extensions==2.2.9 +django-registration==2.0 +Pillow==7.1.2 +six==1.15.0 +sqlparse==0.3.1 +Unidecode==1.1.1 diff --git a/requirements-works1.8.19b.txt b/requirements-works1.8.19b.txt new file mode 100644 index 0000000..8996b70 --- /dev/null +++ b/requirements-works1.8.19b.txt @@ -0,0 +1,7 @@ +Django==1.8.19 +django-extensions==2.2.9 +django-registration==2.0 +Pillow==7.1.2 +six==1.15.0 +sqlparse==0.3.1 +Unidecode==1.1.1