From 65b95cddfb51d1e4af1338365f210299409df8a7 Mon Sep 17 00:00:00 2001 From: michigg Date: Tue, 24 Oct 2017 00:02:17 +0200 Subject: [PATCH 1/8] start lecture mirgrations --- ofu_app/apps/donar/models.py | 20 +++- ofu_app/apps/donar/utils/migrate_data.py | 104 ++++++++++++++++-- .../utils/parser/univis_lectures_parser.py | 29 +++++ ofu_app/apps/events/utils/migrate_data.py | 8 +- 4 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 ofu_app/apps/donar/utils/parser/univis_lectures_parser.py diff --git a/ofu_app/apps/donar/models.py b/ofu_app/apps/donar/models.py index 8ec7b91..5768e93 100644 --- a/ofu_app/apps/donar/models.py +++ b/ofu_app/apps/donar/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils import timezone MAX_LENGTH = 60 @@ -22,4 +23,21 @@ class VGN_Coords(models.Model): name = models.CharField(max_length=MAX_LENGTH, unique=True) coords = models.CharField(max_length=MAX_LENGTH, unique=True) longitude = models.CharField(max_length=MAX_LENGTH, unique=True) - latitude = models.CharField(max_length=MAX_LENGTH, unique=True) \ No newline at end of file + latitude = models.CharField(max_length=MAX_LENGTH, unique=True) + + +class Lecture(models.Model): + id = models.AutoField(primary_key=True) + univis_ref = models.CharField(max_length=MAX_LENGTH, unique=True) + univis_id = models.CharField(max_length=MAX_LENGTH, unique=True) + name = models.CharField(max_length=MAX_LENGTH) + short = models.CharField(max_length=MAX_LENGTH) + type = models.CharField(max_length=MAX_LENGTH) + lecturer_id = models.CharField(max_length=MAX_LENGTH) + term = models.ManyToManyField('Lecture_Terms', blank=False) + + +class Lecture_Terms(models.Model): + id = models.AutoField(primary_key=True) + starttime = time = models.TimeField(blank=False, default=timezone.now()) + room = models.ManyToManyField('Room', blank=False, blank=True, null=True) diff --git a/ofu_app/apps/donar/utils/migrate_data.py b/ofu_app/apps/donar/utils/migrate_data.py index fc1229f..b2176e8 100644 --- a/ofu_app/apps/donar/utils/migrate_data.py +++ b/ofu_app/apps/donar/utils/migrate_data.py @@ -1,15 +1,27 @@ import json from pprint import pprint from django.db.utils import IntegrityError +from datetime import datetime -from apps.donar.models import Room +from apps.donar.models import Room, Lecture_Terms, Lecture from apps.donar.utils.parser import univis_rooms_parser +from apps.donar.utils.parser import univis_lectures_parser -# CONFIG -UNIVIS_RPG_GuK = "http://univis.uni-bamberg.de/prg?search=rooms&department=Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften&show=xml" -UNIVIS_RPG_SoWi = "http://univis.uni-bamberg.de/prg?search=rooms&department=Fakult%E4t%20Sozial-%20und%20Wirtschaftswissenschaften&show=xml" -UNIVIS_RPG_HuWi = "http://univis.uni-bamberg.de/prg?search=rooms&department=Fakult%E4t%20Humanwissenschaften&show=xml" -UNIVIS_RPG_WIAI = "http://univis.uni-bamberg.de/prg?search=rooms&department=Fakult%E4t%20Wirtschaftsinformatik&show=xml" +# CONFIG Fakultaet +FAKULTAET_GuK = "Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften" +FAKULTAET_SoWi = "Fakult%E4t%20Sozial-%20und%20Wirtschaftswissenschaften" +FAKULTAET_HuWi = "Fakult%E4t%20Humanwissenschaften" +FAKULTAET_WIAI = "Fakult%E4t%20Wirtschaftsinformatik" + + +# CONFIG ROOMS +def univis_rooms(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=rooms&department=" + fakultaet + "&show=xml" + + +# CONFIG LECTURES +def univis_lectures(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=lectures&department=" + fakultaet + "&show=exml" def getJsonFromFile(path): @@ -17,7 +29,7 @@ def getJsonFromFile(path): return json.load(file) -def writeFekideDataInDB(data): +def writeUnivisRoomDataInDB(data): for room in data: try: key = "" @@ -53,13 +65,83 @@ def writeFekideDataInDB(data): break +def writeUnivisLectureTermsInDB(lecture, lecture_obj): + if 'terms' in lecture: + if type(lecture['terms']['term']) == list: + for term in lecture['terms']['term']: + try: + term_obj = Lecture_Terms.objects.create() + starttime = "00:00" + if 'starttime' in term: + starttime = term['starttime'] + term_obj.starttime = datetime.strptime(starttime, "%H%H:%M%M") + if 'room' in term: + room_id = term['room']['UnivISRef']['@key'] + term_obj.room = Room.objects.get(key=room_id) + term_obj.save() + lecture_obj.term.add(term_obj) + except IntegrityError as err: + print(err.args) + + else: + try: + term_obj = Lecture_Terms.objects.create() + starttime = "00:00" + if 'starttime' in lecture['terms']['term']: + starttime = lecture['terms']['term']['starttime'] + term_obj.starttime = datetime.strptime(starttime, "%H%H:%M%M") + if 'room' in lecture['terms']['term']: + room_id = lecture['terms']['term']['room']['UnivISRef']['@key'] + term_obj.room = Room.objects.get(key=room_id) + term_obj.save() + lecture_obj.term.add(term_obj) + except IntegrityError as err: + print(err.args) + + +def writeUnivisLectureDataInDB(data): + for lecture in data: + try: + key = '' + name = '' + orgname = '' + short = '' + lecture_type = '' + lecturer_id = '' + + if '@key' in lecture: + key = lecture['@key'] + if 'name' in lecture: + # TODO Fix name bug + name = lecture['name'] + if 'id' in lecture: + univis_id = lecture['id'] + if 'orgname' in lecture: + orgname = lecture['orgname'] + if 'short' in lecture: + short = lecture['short'] + if 'type' in lecture: + lecture_type = lecture['type'] + if 'dozs' in lecture: + lecturer_id = dict(lecture['dozs']['doz']['UnivISRef'])['@key'] + lecture_obj = Lecture.objects.create(univis_ref=key, univis_id=univis_id, name=name, short=short, + type=lecture_type, lecturer_id=lecture_type) + writeUnivisLectureTermsInDB(lecture, lecture_obj) + lecture_obj.save() + except IntegrityError as err: + print() + + return + + def main(): # get food jsons - writeFekideDataInDB(univis_rooms_parser.parsePage(UNIVIS_RPG_GuK)) - writeFekideDataInDB(univis_rooms_parser.parsePage(UNIVIS_RPG_SoWi)) - writeFekideDataInDB(univis_rooms_parser.parsePage(UNIVIS_RPG_HuWi)) - writeFekideDataInDB(univis_rooms_parser.parsePage(UNIVIS_RPG_WIAI)) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_GuK))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_SoWi))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_HuWi))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_WIAI))) pprint("Room: " + str(Room.objects.count())) + writeUnivisLectureDataInDB(univis_lectures_parser.parsePage(univis_lectures(FAKULTAET_WIAI))) if __name__ == '__main__': diff --git a/ofu_app/apps/donar/utils/parser/univis_lectures_parser.py b/ofu_app/apps/donar/utils/parser/univis_lectures_parser.py new file mode 100644 index 0000000..10ae33a --- /dev/null +++ b/ofu_app/apps/donar/utils/parser/univis_lectures_parser.py @@ -0,0 +1,29 @@ +import requests +import datetime +import xmltodict +import json +from pprint import pprint + + +def loadPage(url: str): + return requests.get(url).content + + +def getDay(): + return datetime.datetime.today().strftime("%A, %d.%m.%Y") + + +def getLectures(dict: dict): + lectures = [] + for lecture in dict['UnivIS']['Lecture']: + lectures.append(lecture) + return lectures + + +def parsePage(url): + page = loadPage(url) + dict = xmltodict.parse(page) + lectures = getLectures(dict) + return lectures + +# parsePage( "http://univis.uni-bamberg.de/prg?search=lectures&department=Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften&show=exml") diff --git a/ofu_app/apps/events/utils/migrate_data.py b/ofu_app/apps/events/utils/migrate_data.py index d304734..b1f462a 100644 --- a/ofu_app/apps/events/utils/migrate_data.py +++ b/ofu_app/apps/events/utils/migrate_data.py @@ -129,13 +129,13 @@ def main(): # deleteUnivisObjects() # events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_HuWi) - # writeUnivisDataInDB(events, rooms, persons) + # writeUnivisRoomDataInDB(events, rooms, persons) # events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_SoWi) - # writeUnivisDataInDB(events, rooms, persons) + # writeUnivisRoomDataInDB(events, rooms, persons) # events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_GuK) - # writeUnivisDataInDB(events, rooms, persons) + # writeUnivisRoomDataInDB(events, rooms, persons) # events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_WIAI) - # writeUnivisDataInDB(events, rooms, persons) + # writeUnivisRoomDataInDB(events, rooms, persons) writeFekideDataInDB(fekide_eventpage_parser.parsePage()) From 8dea8a0cc857c548bfa245c37897363c41577d06 Mon Sep 17 00:00:00 2001 From: michigg Date: Sat, 28 Oct 2017 22:18:09 +0200 Subject: [PATCH 2/8] added lectures migrator --- ofu_app/apps/donar/admin.py | 6 +- .../management/commands/import_lectures.py | 14 +++ .../donar/management/commands/import_rooms.py | 4 +- .../management/commands/import_vgn_coords.py | 11 ++ ofu_app/apps/donar/migrations/0001_initial.py | 59 ++++++++-- .../migrations/0002_auto_20171004_0016.py | 20 ---- .../migrations/0002_auto_20171028_1904.py | 22 ++++ .../migrations/0003_auto_20171004_0211.py | 55 --------- .../migrations/0003_auto_20171028_1959.py | 22 ++++ .../migrations/0005_auto_20171017_1603.py | 37 ------ ofu_app/apps/donar/models.py | 16 ++- ...grate_data.py => migrate_data_lectures.py} | 82 +++++-------- .../apps/donar/utils/migrate_data_rooms.py | 108 ++++++++++++++++++ .../migrate_data_vgn_coords.py} | 13 +-- ofu_app/apps/donar/views.py | 13 ++- .../migrations/0006_allergene.py} | 9 +- .../__pycache__/settings.cpython-35.pyc | Bin 3077 -> 3077 bytes .../ofu_app/__pycache__/urls.cpython-35.pyc | Bin 1302 -> 1302 bytes ofu_app/templates/donar/search_rooms.jinja | 51 ++++++--- 19 files changed, 326 insertions(+), 216 deletions(-) create mode 100644 ofu_app/apps/donar/management/commands/import_lectures.py create mode 100644 ofu_app/apps/donar/management/commands/import_vgn_coords.py delete mode 100644 ofu_app/apps/donar/migrations/0002_auto_20171004_0016.py create mode 100644 ofu_app/apps/donar/migrations/0002_auto_20171028_1904.py delete mode 100644 ofu_app/apps/donar/migrations/0003_auto_20171004_0211.py create mode 100644 ofu_app/apps/donar/migrations/0003_auto_20171028_1959.py delete mode 100644 ofu_app/apps/donar/migrations/0005_auto_20171017_1603.py rename ofu_app/apps/donar/utils/{migrate_data.py => migrate_data_lectures.py} (63%) create mode 100644 ofu_app/apps/donar/utils/migrate_data_rooms.py rename ofu_app/apps/donar/{management/commands/import_locations.py => utils/migrate_data_vgn_coords.py} (91%) rename ofu_app/apps/{donar/migrations/0004_vgn_coords.py => food/migrations/0006_allergene.py} (54%) diff --git a/ofu_app/apps/donar/admin.py b/ofu_app/apps/donar/admin.py index 8c38f3f..9d714c3 100644 --- a/ofu_app/apps/donar/admin.py +++ b/ofu_app/apps/donar/admin.py @@ -1,3 +1,7 @@ from django.contrib import admin - +from apps.donar.models import Room, Lecture, Lecture_Terms, VGN_Coords # Register your models here. +admin.site.register(Room) +admin.site.register(Lecture) +admin.site.register(Lecture_Terms) +admin.site.register(VGN_Coords) \ No newline at end of file diff --git a/ofu_app/apps/donar/management/commands/import_lectures.py b/ofu_app/apps/donar/management/commands/import_lectures.py new file mode 100644 index 0000000..1f80d31 --- /dev/null +++ b/ofu_app/apps/donar/management/commands/import_lectures.py @@ -0,0 +1,14 @@ +from django.core.management.base import BaseCommand, CommandError +from apps.donar.models import Room +from apps.donar.utils import migrate_data_lectures + + +class Command(BaseCommand): + help = "Imports Lectures from UnivIS PRG. Requires Room import" + + def add_arguments(self, parser): + pass + + def handle(self, *args, **options): + migrate_data_lectures.main() + self.stdout.write(self.style.SUCCESS('Successfully migrate data')) diff --git a/ofu_app/apps/donar/management/commands/import_rooms.py b/ofu_app/apps/donar/management/commands/import_rooms.py index 36e5371..1857bb2 100644 --- a/ofu_app/apps/donar/management/commands/import_rooms.py +++ b/ofu_app/apps/donar/management/commands/import_rooms.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand, CommandError from apps.donar.models import Room -from apps.donar.utils import migrate_data +from apps.donar.utils import migrate_data_rooms class Command(BaseCommand): @@ -10,5 +10,5 @@ class Command(BaseCommand): pass def handle(self, *args, **options): - migrate_data.main() + migrate_data_rooms.main() self.stdout.write(self.style.SUCCESS('Successfully migrate data')) diff --git a/ofu_app/apps/donar/management/commands/import_vgn_coords.py b/ofu_app/apps/donar/management/commands/import_vgn_coords.py new file mode 100644 index 0000000..9a31ae6 --- /dev/null +++ b/ofu_app/apps/donar/management/commands/import_vgn_coords.py @@ -0,0 +1,11 @@ +from django.core.management.base import BaseCommand, CommandError +from apps.donar.utils import migrate_data_vgn_coords + +class Command(BaseCommand): + help = "Imports Rooms from Univis PRG" + + def add_arguments(self, parser): + pass + + def handle(self, *args, **options): + migrate_data_vgn_coords.migrate() diff --git a/ofu_app/apps/donar/migrations/0001_initial.py b/ofu_app/apps/donar/migrations/0001_initial.py index 3a6711c..30ca8d0 100644 --- a/ofu_app/apps/donar/migrations/0001_initial.py +++ b/ofu_app/apps/donar/migrations/0001_initial.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-10-03 22:01 +# Generated by Django 1.11.2 on 2017-10-28 17:00 from __future__ import unicode_literals +import datetime from django.db import migrations, models +from django.utils.timezone import utc class Migration(migrations.Migration): @@ -13,17 +15,58 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Lecture', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('univis_ref', models.CharField(max_length=60, unique=True)), + ('univis_id', models.CharField(max_length=60, unique=True)), + ('name', models.CharField(max_length=60)), + ('short', models.CharField(max_length=60)), + ('type', models.CharField(max_length=60)), + ('lecturer_id', models.CharField(max_length=60)), + ], + ), + migrations.CreateModel( + name='Lecture_Terms', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('starttime', models.TimeField(default=datetime.datetime(2017, 10, 28, 17, 0, 39, 511935, tzinfo=utc))), + ], + ), migrations.CreateModel( name='Room', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), - ('key', models.CharField(max_length=60)), - ('address', models.CharField(max_length=60)), - ('building_key', models.CharField(max_length=60)), - ('floor', models.CharField(max_length=60)), - ('name', models.CharField(max_length=60)), - ('orgname', models.CharField(max_length=60)), - ('short', models.CharField(max_length=60)), + ('key', models.CharField(default='', max_length=60)), + ('address', models.CharField(default='', max_length=60)), + ('building_key', models.CharField(default='', max_length=60)), + ('floor', models.CharField(default='', max_length=60)), + ('name', models.CharField(default='', max_length=60)), + ('orgname', models.CharField(default='', max_length=60)), + ('short', models.CharField(max_length=60, unique=True)), + ('size', models.CharField(default='', max_length=60)), + ('description', models.CharField(default='', max_length=200)), ], ), + migrations.CreateModel( + name='VGN_Coords', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=60, unique=True)), + ('coords', models.CharField(max_length=60, unique=True)), + ('longitude', models.CharField(max_length=60, unique=True)), + ('latitude', models.CharField(max_length=60, unique=True)), + ], + ), + migrations.AddField( + model_name='lecture_terms', + name='room', + field=models.ManyToManyField(blank=True, to='donar.Room'), + ), + migrations.AddField( + model_name='lecture', + name='term', + field=models.ManyToManyField(to='donar.Lecture_Terms'), + ), ] diff --git a/ofu_app/apps/donar/migrations/0002_auto_20171004_0016.py b/ofu_app/apps/donar/migrations/0002_auto_20171004_0016.py deleted file mode 100644 index 522314d..0000000 --- a/ofu_app/apps/donar/migrations/0002_auto_20171004_0016.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-10-03 22:16 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='room', - name='short', - field=models.CharField(max_length=60, unique=True), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0002_auto_20171028_1904.py b/ofu_app/apps/donar/migrations/0002_auto_20171028_1904.py new file mode 100644 index 0000000..d15af98 --- /dev/null +++ b/ofu_app/apps/donar/migrations/0002_auto_20171028_1904.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-10-28 17:04 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('donar', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='lecture_terms', + name='starttime', + field=models.TimeField(default=datetime.datetime(2017, 10, 28, 17, 4, 19, 160312, tzinfo=utc)), + ), + ] diff --git a/ofu_app/apps/donar/migrations/0003_auto_20171004_0211.py b/ofu_app/apps/donar/migrations/0003_auto_20171004_0211.py deleted file mode 100644 index 96b39be..0000000 --- a/ofu_app/apps/donar/migrations/0003_auto_20171004_0211.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-10-04 00:11 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0002_auto_20171004_0016'), - ] - - operations = [ - migrations.AddField( - model_name='room', - name='description', - field=models.CharField(default='', max_length=200), - ), - migrations.AddField( - model_name='room', - name='size', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='address', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='building_key', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='floor', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='key', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='name', - field=models.CharField(default='', max_length=60), - ), - migrations.AlterField( - model_name='room', - name='orgname', - field=models.CharField(default='', max_length=60), - ), - ] diff --git a/ofu_app/apps/donar/migrations/0003_auto_20171028_1959.py b/ofu_app/apps/donar/migrations/0003_auto_20171028_1959.py new file mode 100644 index 0000000..2207e10 --- /dev/null +++ b/ofu_app/apps/donar/migrations/0003_auto_20171028_1959.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-10-28 17:59 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('donar', '0002_auto_20171028_1904'), + ] + + operations = [ + migrations.AlterField( + model_name='lecture_terms', + name='starttime', + field=models.TimeField(default=datetime.datetime(2017, 10, 28, 17, 59, 39, 456896, tzinfo=utc)), + ), + ] diff --git a/ofu_app/apps/donar/migrations/0005_auto_20171017_1603.py b/ofu_app/apps/donar/migrations/0005_auto_20171017_1603.py deleted file mode 100644 index 744056d..0000000 --- a/ofu_app/apps/donar/migrations/0005_auto_20171017_1603.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-10-17 14:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('donar', '0004_vgn_coords'), - ] - - operations = [ - migrations.AddField( - model_name='vgn_coords', - name='latitude', - field=models.CharField(default=0, max_length=60, unique=True), - preserve_default=False, - ), - migrations.AddField( - model_name='vgn_coords', - name='longitude', - field=models.CharField(default=0, max_length=60, unique=True), - preserve_default=False, - ), - migrations.AlterField( - model_name='vgn_coords', - name='coords', - field=models.CharField(max_length=60, unique=True), - ), - migrations.AlterField( - model_name='vgn_coords', - name='name', - field=models.CharField(max_length=60, unique=True), - ), - ] diff --git a/ofu_app/apps/donar/models.py b/ofu_app/apps/donar/models.py index 5768e93..d88ea27 100644 --- a/ofu_app/apps/donar/models.py +++ b/ofu_app/apps/donar/models.py @@ -17,6 +17,9 @@ class Room(models.Model): size = models.CharField(max_length=MAX_LENGTH, default="") description = models.CharField(max_length=200, default="") + def __str__(self): + return "%s - size: %s" % (self.short, str(self.size)) + class VGN_Coords(models.Model): id = models.AutoField(primary_key=True) @@ -25,6 +28,9 @@ class VGN_Coords(models.Model): longitude = models.CharField(max_length=MAX_LENGTH, unique=True) latitude = models.CharField(max_length=MAX_LENGTH, unique=True) + def __str__(self): + return "%s" % self.name + class Lecture(models.Model): id = models.AutoField(primary_key=True) @@ -36,8 +42,14 @@ class Lecture(models.Model): lecturer_id = models.CharField(max_length=MAX_LENGTH) term = models.ManyToManyField('Lecture_Terms', blank=False) + def __str__(self): + return "%s - Type: %s" % (self.short, str(self.type)) + class Lecture_Terms(models.Model): id = models.AutoField(primary_key=True) - starttime = time = models.TimeField(blank=False, default=timezone.now()) - room = models.ManyToManyField('Room', blank=False, blank=True, null=True) + starttime = models.TimeField(blank=False, default=timezone.now()) + room = models.ManyToManyField('Room', blank=True) + + def __str__(self): + return "%s" % self.starttime.strftime("%Y-%m-%d") diff --git a/ofu_app/apps/donar/utils/migrate_data.py b/ofu_app/apps/donar/utils/migrate_data_lectures.py similarity index 63% rename from ofu_app/apps/donar/utils/migrate_data.py rename to ofu_app/apps/donar/utils/migrate_data_lectures.py index b2176e8..2fbbcc6 100644 --- a/ofu_app/apps/donar/utils/migrate_data.py +++ b/ofu_app/apps/donar/utils/migrate_data_lectures.py @@ -1,10 +1,8 @@ +from apps.donar.models import Room, Lecture_Terms, Lecture +from datetime import datetime import json from pprint import pprint from django.db.utils import IntegrityError -from datetime import datetime - -from apps.donar.models import Room, Lecture_Terms, Lecture -from apps.donar.utils.parser import univis_rooms_parser from apps.donar.utils.parser import univis_lectures_parser # CONFIG Fakultaet @@ -29,42 +27,6 @@ def getJsonFromFile(path): return json.load(file) -def writeUnivisRoomDataInDB(data): - for room in data: - try: - key = "" - address = "" - building_key = "" - floor = "" - name = "" - orgname = "" - short = "" - size = "" - description = "" - if '@key' in room: - key = room['@key'] - if 'address' in room: - address = room['address'] - if 'buildingkey' in room: - building_key = room['buildingkey'] - if 'floor' in room: - floor = room['floor'] - if 'name' in room: - name = room['name'] - if 'short' in room: - short = room['short'] - if 'size' in room: - size = room['size'] - if 'description' in room: - description = room['description'] - - Room.objects.create(key=key, address=address, building_key=building_key, floor=floor, name=name, - orgname=orgname, short=short, size=size, description=description) - except IntegrityError: - # ignored - break - - def writeUnivisLectureTermsInDB(lecture, lecture_obj): if 'terms' in lecture: if type(lecture['terms']['term']) == list: @@ -74,10 +36,10 @@ def writeUnivisLectureTermsInDB(lecture, lecture_obj): starttime = "00:00" if 'starttime' in term: starttime = term['starttime'] - term_obj.starttime = datetime.strptime(starttime, "%H%H:%M%M") + term_obj.starttime = datetime.strptime(starttime, "%H:%M") if 'room' in term: room_id = term['room']['UnivISRef']['@key'] - term_obj.room = Room.objects.get(key=room_id) + term_obj.room = [Room.objects.get(key=room_id)] term_obj.save() lecture_obj.term.add(term_obj) except IntegrityError as err: @@ -86,13 +48,16 @@ def writeUnivisLectureTermsInDB(lecture, lecture_obj): else: try: term_obj = Lecture_Terms.objects.create() - starttime = "00:00" + univis_starttime = "00:00" if 'starttime' in lecture['terms']['term']: - starttime = lecture['terms']['term']['starttime'] - term_obj.starttime = datetime.strptime(starttime, "%H%H:%M%M") + univis_starttime = lecture['terms']['term']['starttime'] + term_obj.starttime = datetime.strptime(univis_starttime, '%H:%M') if 'room' in lecture['terms']['term']: room_id = lecture['terms']['term']['room']['UnivISRef']['@key'] - term_obj.room = Room.objects.get(key=room_id) + pprint("Room: " + room_id) + Room.objects.get(key=room_id) + term_obj.room = [Room.objects.get(key=room_id)] + term_obj.save() lecture_obj.term.add(term_obj) except IntegrityError as err: @@ -124,24 +89,35 @@ def writeUnivisLectureDataInDB(data): lecture_type = lecture['type'] if 'dozs' in lecture: lecturer_id = dict(lecture['dozs']['doz']['UnivISRef'])['@key'] + print("Lecture: " + name) lecture_obj = Lecture.objects.create(univis_ref=key, univis_id=univis_id, name=name, short=short, - type=lecture_type, lecturer_id=lecture_type) + type=lecture_type, lecturer_id=lecturer_id) writeUnivisLectureTermsInDB(lecture, lecture_obj) lecture_obj.save() except IntegrityError as err: - print() + print(err.args) return +def showStatus(status: str): + print(status) + pprint("Lectures: " + str(Lecture.objects.count())) + pprint("Lecture Terms: " + str(Lecture_Terms.objects.count())) + pprint("Room: " + str(Room.objects.count())) + + def main(): # get food jsons - # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_GuK))) - # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_SoWi))) - # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_HuWi))) - # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_WIAI))) - pprint("Room: " + str(Room.objects.count())) + showStatus("Start with:") + # writeUnivisLectureDataInDB(univis_lectures_parser.parsePage(univis_lectures(FAKULTAET_SoWi))) + showStatus("After SoWi:") + # writeUnivisLectureDataInDB(univis_lectures_parser.parsePage(univis_lectures(FAKULTAET_GuK))) + showStatus("After GuK:") + writeUnivisLectureDataInDB(univis_lectures_parser.parsePage(univis_lectures(FAKULTAET_HuWi))) + showStatus("After HuWi:") writeUnivisLectureDataInDB(univis_lectures_parser.parsePage(univis_lectures(FAKULTAET_WIAI))) + showStatus("After WIAI:") if __name__ == '__main__': diff --git a/ofu_app/apps/donar/utils/migrate_data_rooms.py b/ofu_app/apps/donar/utils/migrate_data_rooms.py new file mode 100644 index 0000000..737376b --- /dev/null +++ b/ofu_app/apps/donar/utils/migrate_data_rooms.py @@ -0,0 +1,108 @@ +import json +from pprint import pprint +from django.db.utils import IntegrityError + +from apps.donar.models import Room, Lecture_Terms, Lecture +from apps.donar.utils.parser import univis_rooms_parser +from apps.donar.utils.parser import univis_lectures_parser + +# CONFIG Fakultaet +FAKULTAET_GuK = "Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften" +FAKULTAET_SoWi = "Fakult%E4t%20Sozial-%20und%20Wirtschaftswissenschaften" +FAKULTAET_HuWi = "Fakult%E4t%20Humanwissenschaften" +FAKULTAET_WIAI = "Fakult%E4t%20Wirtschaftsinformatik" + +# CONFIG Locations +RZ = "http://univis.uni-bamberg.de/prg?search=rooms&name=rz&show=xml" +WEBEREI = "http://univis.uni-bamberg.de/prg?search=rooms&name=we&show=xml" +FEKI = "http://univis.uni-bamberg.de/prg?search=rooms&name=f&show=xml" +MARKUSHAUS = "http://univis.uni-bamberg.de/prg?search=rooms&name=m&show=xml" +UNIVERSITAET = "http://univis.uni-bamberg.de/prg?search=rooms&name=u&show=xml" +KAPUZINERSTR = "http://univis.uni-bamberg.de/prg?search=rooms&name=k&show=xml" +ZWINGER = "http://univis.uni-bamberg.de/prg?search=rooms&name=z&show=xml" +AULA = "http://univis.uni-bamberg.de/prg?search=rooms&name=a&show=xml" +ZWINGER = "http://univis.uni-bamberg.de/prg?search=rooms&name=k&show=xml" +ZWINGER = "http://univis.uni-bamberg.de/prg?search=rooms&name=k&show=xml" + + +# CONFIG ROOMS +def univis_rooms(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=rooms&department=" + fakultaet + "&show=xml" + + +# CONFIG LECTURES +def univis_lectures(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=lectures&department=" + fakultaet + "&show=exml" + + +def univis_rooms_loc(kuerzel): + return "http://univis.uni-bamberg.de/prg?search=rooms&name=" + kuerzel + "&show=xml" + + +def getJsonFromFile(path): + with open(path, "r") as file: + return json.load(file) + + +def writeUnivisRoomDataInDB(data): + for room in data: + try: + key = "" + address = "" + building_key = "" + floor = "" + name = "" + orgname = "" + short = "" + size = "" + description = "" + if '@key' in room: + key = room['@key'] + if 'address' in room: + address = room['address'] + if 'buildingkey' in room: + building_key = room['buildingkey'] + if 'floor' in room: + floor = room['floor'] + if 'name' in room: + name = room['name'] + if 'short' in room: + short = room['short'] + if 'size' in room: + size = room['size'] + if 'description' in room: + description = room['description'] + + Room.objects.create(key=key, address=address, building_key=building_key, floor=floor, name=name, + orgname=orgname, short=short, size=size, description=description) + except IntegrityError as err: + pprint(err.args) + + +def main(): + # get food jsons + pprint("Begin: Room: " + str(Room.objects.count())) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_GuK))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_SoWi))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_HuWi))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_WIAI))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("k"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("z"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("u"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("w"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("f"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("r"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("h"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("l"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("m"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("o"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("p"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("v"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("w"))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("d"))) + + pprint("Now: Room: " + str(Room.objects.count())) + + +if __name__ == '__main__': + main() diff --git a/ofu_app/apps/donar/management/commands/import_locations.py b/ofu_app/apps/donar/utils/migrate_data_vgn_coords.py similarity index 91% rename from ofu_app/apps/donar/management/commands/import_locations.py rename to ofu_app/apps/donar/utils/migrate_data_vgn_coords.py index 46aff78..faf00d2 100644 --- a/ofu_app/apps/donar/management/commands/import_locations.py +++ b/ofu_app/apps/donar/utils/migrate_data_vgn_coords.py @@ -1,8 +1,7 @@ -from django.core.management.base import BaseCommand, CommandError from apps.donar.models import VGN_Coords -def migrate_locations(): +def migrate(): locations = [] locations.append( {'location': 'Erba', 'vgn_key': 'coord%3A4418901%3A629758%3ANAV4%3ABamberg%2C An der Weberei 5', @@ -65,13 +64,3 @@ def migrate_locations(): location_obj.coords = location['vgn_key'] location_obj.latitude = location['lat'] location_obj.longitude = location['lon'] - - -class Command(BaseCommand): - help = "Imports Rooms from Univis PRG" - - def add_arguments(self, parser): - pass - - def handle(self, *args, **options): - migrate_locations() diff --git a/ofu_app/apps/donar/views.py b/ofu_app/apps/donar/views.py index fb884fb..6968773 100644 --- a/ofu_app/apps/donar/views.py +++ b/ofu_app/apps/donar/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render, redirect - -from apps.donar.models import Room +from django.db.models import Min +from apps.donar.models import Room, Lecture, Lecture_Terms from apps.donar.models import VGN_Coords @@ -15,11 +15,12 @@ def all_rooms(request): def search_room(request): - id = request.GET.get('search_room', None) - if id: + token = request.GET.get('search_room', None) + if token: # create a form instance and populate it with data from the request: - rooms = Room.objects.filter(short__contains=id) - return render(request, 'donar/search_rooms.jinja', {'id': id, 'rooms': rooms}) + rooms_by_id = Room.objects.filter(short__contains=token) + lectures = Lecture.objects.annotate(min_starttime=Min('term__starttime')).filter(name__contains=token).order_by('min_starttime') + return render(request, 'donar/search_rooms.jinja', {'id': token, 'rooms': rooms_by_id, 'lectures': lectures}) return render(request, 'donar/search_rooms.jinja', {}) diff --git a/ofu_app/apps/donar/migrations/0004_vgn_coords.py b/ofu_app/apps/food/migrations/0006_allergene.py similarity index 54% rename from ofu_app/apps/donar/migrations/0004_vgn_coords.py rename to ofu_app/apps/food/migrations/0006_allergene.py index d20ed2a..c7df688 100644 --- a/ofu_app/apps/donar/migrations/0004_vgn_coords.py +++ b/ofu_app/apps/food/migrations/0006_allergene.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.2 on 2017-10-17 13:34 +# Generated by Django 1.11.2 on 2017-10-28 17:00 from __future__ import unicode_literals from django.db import migrations, models @@ -8,16 +8,15 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('donar', '0003_auto_20171004_0211'), + ('food', '0005_auto_20171020_0549'), ] operations = [ migrations.CreateModel( - name='VGN_Coords', + name='Allergene', fields=[ ('id', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(default='', max_length=60, unique=True)), - ('coords', models.CharField(default='', max_length=60, unique=True)), + ('name', models.CharField(max_length=60, unique=True)), ], ), ] diff --git a/ofu_app/ofu_app/__pycache__/settings.cpython-35.pyc b/ofu_app/ofu_app/__pycache__/settings.cpython-35.pyc index 52727f12f3c1950f0f152043ade210d034bf4154..1e55191a4778688778dfa844e7b6c47a1afad862 100644 GIT binary patch delta 16 XcmZpbXq8|W=jG+n-0)>1`#){~Bf$j= delta 16 XcmZpbXq8|W=jG-4eCh2*_J7;}DewjG diff --git a/ofu_app/ofu_app/__pycache__/urls.cpython-35.pyc b/ofu_app/ofu_app/__pycache__/urls.cpython-35.pyc index aae6074ee141c1c8426a917e196ec35582474db4..500068f65386a8965188846f15e410e1265015a3 100644 GIT binary patch delta 16 XcmbQnHI0j1oR^pD!;beG+4)%kC))(( delta 16 XcmbQnHI0j1oR^nN#`e}mc79d>9>fEJ diff --git a/ofu_app/templates/donar/search_rooms.jinja b/ofu_app/templates/donar/search_rooms.jinja index 931857a..731a4dc 100644 --- a/ofu_app/templates/donar/search_rooms.jinja +++ b/ofu_app/templates/donar/search_rooms.jinja @@ -7,24 +7,45 @@
- +
-
- {% if id %} + {% if id %} +

Ergebnisse für: {{ id }}

- {% endif %} -
-
- {% if rooms %} - {% for room in rooms %} -
- +
+ {% if rooms %} +

Ergebnisse Räume:

+ {% for room in rooms %} + -
- {% endfor %} - {% endif %} -
+ {% endfor %} + {% endif %} +
+
+ {% if lectures %} +

Ergebnisse Lehrveranstaltungen:

+ {% for lecture in lectures %} +
+
+
{{ lecture.name }}
+ {% for term in lecture.term.all() %} + Start: {{ term.starttime.strftime("%H:%M") }} + {% for room in term.room.all() %} +

+ Raum: {{ room.short }}

+ {% endfor %} + {% endfor %} +
+
+ {% endfor %} + {% endif %} +
+ {% endif %}
{% endblock %} From 5a0304242baa110a4e2960384ae71355051e22ab Mon Sep 17 00:00:00 2001 From: michigg Date: Sat, 28 Oct 2017 23:26:43 +0200 Subject: [PATCH 3/8] add simple user management --- ofu_app/ofu_app/settings.py | 4 ++- ofu_app/ofu_app/urls.py | 4 +++ ofu_app/templates/base.jinja | 8 +++-- ofu_app/templates/registration/login.jinja | 31 ++++++++++++++++++++ ofu_app/templates/registration/sign_up.jinja | 0 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 ofu_app/templates/registration/login.jinja create mode 100644 ofu_app/templates/registration/sign_up.jinja diff --git a/ofu_app/ofu_app/settings.py b/ofu_app/ofu_app/settings.py index 0f548c2..17b7f54 100644 --- a/ofu_app/ofu_app/settings.py +++ b/ofu_app/ofu_app/settings.py @@ -58,7 +58,7 @@ REST_FRAMEWORK = { # ] ROOT_URLCONF = 'ofu_app.urls' - +TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates'), TEMPLATES = [ { 'BACKEND': 'django_jinja.backend.Jinja2', @@ -160,3 +160,5 @@ SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # Media files should be stored here MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = '/media/' + +LOGIN_REDIRECT_URL = 'home' diff --git a/ofu_app/ofu_app/urls.py b/ofu_app/ofu_app/urls.py index d26dcc4..79b9c4c 100644 --- a/ofu_app/ofu_app/urls.py +++ b/ofu_app/ofu_app/urls.py @@ -15,10 +15,14 @@ Including another URLconf """ from django.conf.urls import url, include from django.contrib import admin +from django.contrib.auth import views as auth_views from ofu_app import views urlpatterns = [ + url(r'^login/$', auth_views.login, {'template_name': 'registration/login.jinja'}, name='login'), + url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'), url(r'^admin/', admin.site.urls), + # url(r'^signup/$', core_views.signup, name='signup'), url(r'^$', views.home, name="home"), # -- Apps -- diff --git a/ofu_app/templates/base.jinja b/ofu_app/templates/base.jinja index 21c1944..e4d8545 100644 --- a/ofu_app/templates/base.jinja +++ b/ofu_app/templates/base.jinja @@ -22,8 +22,12 @@ {% block body %}
-
- +
+ {% if request.user.is_authenticated() %} + + {% else %} + + {% endif %}
{% block headline %}{% endblock %}
diff --git a/ofu_app/templates/registration/login.jinja b/ofu_app/templates/registration/login.jinja new file mode 100644 index 0000000..3957bc9 --- /dev/null +++ b/ofu_app/templates/registration/login.jinja @@ -0,0 +1,31 @@ +{% extends 'base.jinja' %} + +{% block headline %}

BaStA Login

{% endblock %} + +{% block content %} +
+
+

Login

+
+ {% csrf_token %} + {% if form.errors %} +
+
+ Your username and password didn't match. Please try again. +
+
+ {% endif %} + +

+ +

+ +

+ +

+ + +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ofu_app/templates/registration/sign_up.jinja b/ofu_app/templates/registration/sign_up.jinja new file mode 100644 index 0000000..e69de29 From 6ca65366d7170413f1dd393aad3a4f5c27e4f8a8 Mon Sep 17 00:00:00 2001 From: michigg Date: Sun, 29 Oct 2017 00:21:08 +0200 Subject: [PATCH 4/8] little layout fixing --- ofu_app/static/css/nav.css | 5 -- ofu_app/templates/base.jinja | 77 +++++++++++----------- ofu_app/templates/food/daily_food.jinja | 2 +- ofu_app/templates/food/food_wrapper.jinja | 2 +- ofu_app/templates/food/weekly_food.jinja | 2 +- ofu_app/templates/home.jinja | 6 +- ofu_app/templates/macros/food_macros.jinja | 2 +- ofu_app/templates/registration/login.jinja | 44 ++++++------- 8 files changed, 67 insertions(+), 73 deletions(-) diff --git a/ofu_app/static/css/nav.css b/ofu_app/static/css/nav.css index fb14fd1..5c19023 100644 --- a/ofu_app/static/css/nav.css +++ b/ofu_app/static/css/nav.css @@ -55,12 +55,7 @@ #menu-button { text-align: center; - margin-top: 12px;; height: 100%; } -#menu-button i { - -} - diff --git a/ofu_app/templates/base.jinja b/ofu_app/templates/base.jinja index e4d8545..614cdb6 100644 --- a/ofu_app/templates/base.jinja +++ b/ofu_app/templates/base.jinja @@ -21,55 +21,56 @@ {% block body %} -
-
- {% if request.user.is_authenticated() %} - - {% else %} - - {% endif %} -
-
- {% block headline %}{% endblock %}
-
-