diff --git a/RIGS/migrations/0039_delete_eventcrew.py b/RIGS/migrations/0039_delete_eventcrew.py new file mode 100644 index 00000000..51576883 --- /dev/null +++ b/RIGS/migrations/0039_delete_eventcrew.py @@ -0,0 +1,16 @@ +# Generated by Django 3.0.3 on 2020-03-18 00:24 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('RIGS', '0038_auto_20200306_2000'), + ] + + operations = [ + migrations.DeleteModel( + name='EventCrew', + ), + ] diff --git a/RIGS/models.py b/RIGS/models.py index 2b22da05..e7f0d689 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -93,7 +93,6 @@ class RevisionMixin(object): return "V{0} | R{1}".format(version.pk, version.revision.pk) -@reversion.register class Person(models.Model, RevisionMixin): name = models.CharField(max_length=50) phone = models.CharField(max_length=15, blank=True, null=True) @@ -130,7 +129,6 @@ class Person(models.Model, RevisionMixin): return reverse_lazy('person_detail', kwargs={'pk': self.pk}) -@reversion.register class Organisation(models.Model, RevisionMixin): name = models.CharField(max_length=50) phone = models.CharField(max_length=15, blank=True, null=True) @@ -202,7 +200,6 @@ class VatRate(models.Model, RevisionMixin): return self.comment + " " + str(self.start_at) + " @ " + str(self.as_percent) + "%" -@reversion.register class Venue(models.Model, RevisionMixin): name = models.CharField(max_length=255) phone = models.CharField(max_length=15, blank=True, null=True) @@ -484,15 +481,6 @@ class EventItem(models.Model): return str(self.event.pk) + "." + str(self.order) + ": " + self.event.name + " | " + self.name -class EventCrew(models.Model): - event = models.ForeignKey('Event', related_name='crew', on_delete=models.CASCADE) - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - rig = models.BooleanField(default=False) - run = models.BooleanField(default=False) - derig = models.BooleanField(default=False) - notes = models.TextField(blank=True, null=True) - - @reversion.register class EventAuthorisation(models.Model, RevisionMixin): event = models.OneToOneField('Event', related_name='authorisation', on_delete=models.CASCADE) diff --git a/RIGS/urls.py b/RIGS/urls.py index 01dc1d94..4d763106 100644 --- a/RIGS/urls.py +++ b/RIGS/urls.py @@ -82,32 +82,31 @@ urlpatterns = [ rigboard.EventDetail.as_view()), name='event_detail'), path('event/create/', - permission_required_with_403('RIGS.add_event')(rigboard.EventCreate.as_view()), - name='event_create'), + permission_required_with_403('RIGS.add_event')(rigboard.EventCreate.as_view()), + name='event_create'), path('event/archive/', login_required()(rigboard.EventArchive.as_view()), name='event_archive'), path('event//embed/', xframe_options_exempt( - login_required(login_url='/user/login/embed/')(rigboard.EventEmbed.as_view())), - name='event_embed'), + login_required(login_url='/user/login/embed/')(rigboard.EventEmbed.as_view())), + name='event_embed'), path('event//oembed_json/', - rigboard.EventOembed.as_view(), - name='event_oembed'), + rigboard.EventOembed.as_view(), + name='event_oembed'), path('event//print/', - permission_required_with_403('RIGS.view_event')(rigboard.EventPrint.as_view()), - name='event_print'), + permission_required_with_403('RIGS.view_event')(rigboard.EventPrint.as_view()), + name='event_print'), path('event//ra/', - permission_required_with_403('RIGS.change_event')(rigboard.EventRA.as_view()), - name='event_ra'), + permission_required_with_403('RIGS.change_event')(rigboard.EventRA.as_view()), + name='event_ra'), path('event//edit/', - permission_required_with_403('RIGS.change_event')(rigboard.EventUpdate.as_view()), - name='event_update'), + permission_required_with_403('RIGS.change_event')(rigboard.EventUpdate.as_view()), + name='event_update'), path('event//duplicate/', - permission_required_with_403('RIGS.add_event')(rigboard.EventDuplicate.as_view()), - name='event_duplicate'), - + permission_required_with_403('RIGS.add_event')(rigboard.EventDuplicate.as_view()), + name='event_duplicate'), path('event//history/', - permission_required_with_403('RIGS.view_event')(versioning.VersionHistory.as_view()), - name='event_history', kwargs={'model': models.Event}), + permission_required_with_403('RIGS.view_event')(versioning.VersionHistory.as_view()), + name='event_history', kwargs={'model': models.Event}), # Finance url(r'^invoice/$', diff --git a/assets/admin.py b/assets/admin.py index 3e6c9d58..a62c90e3 100644 --- a/assets/admin.py +++ b/assets/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin +from reversion.admin import VersionAdmin from assets import models as assets @@ -15,13 +16,13 @@ class AssetStatusAdmin(admin.ModelAdmin): @admin.register(assets.Supplier) -class SupplierAdmin(admin.ModelAdmin): +class SupplierAdmin(VersionAdmin): list_display = ['id', 'name'] ordering = ['id'] @admin.register(assets.Asset) -class AssetAdmin(admin.ModelAdmin): +class AssetAdmin(VersionAdmin): list_display = ['id', 'asset_id', 'description', 'category', 'status'] list_filter = ['is_cable', 'category'] search_fields = ['id', 'asset_id', 'description'] diff --git a/assets/migrations/0012_remove_asset_next_sched_maint.py b/assets/migrations/0012_remove_asset_next_sched_maint.py new file mode 100644 index 00000000..cc7f1a1f --- /dev/null +++ b/assets/migrations/0012_remove_asset_next_sched_maint.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.3 on 2020-03-18 00:24 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0011_auto_20200317_2006'), + ] + + operations = [ + migrations.RemoveField( + model_name='asset', + name='next_sched_maint', + ), + ] diff --git a/assets/models.py b/assets/models.py index 4853695d..c3bc49b6 100644 --- a/assets/models.py +++ b/assets/models.py @@ -89,7 +89,6 @@ class Asset(models.Model, RevisionMixin): purchase_price = models.DecimalField(blank=True, null=True, decimal_places=2, max_digits=10) salvage_value = models.DecimalField(blank=True, null=True, decimal_places=2, max_digits=10) comments = models.TextField(blank=True) - next_sched_maint = models.DateField(blank=True, null=True) # Cable assets is_cable = models.BooleanField(default=False) diff --git a/importer.py b/importer.py deleted file mode 100644 index 44df4c15..00000000 --- a/importer.py +++ /dev/null @@ -1,375 +0,0 @@ -__author__ = 'Ghost' -import os - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PyRIGS.settings") -import django - -django.setup() - -from django.db import connection, connections -from django.core.exceptions import ObjectDoesNotExist -from django.db.utils import ConnectionDoesNotExist -from django.db import transaction -from RIGS import models -import reversion -import datetime -import uuid -from multiprocessing import Process - -# Slight fix for needing to restablish the connection -connection.close() - - -def fix_email(email): - if not (email is None or email is "") and ("@" not in email): - email += "@nottingham.ac.uk" - return email - - -def setup_cursor(): - try: - cursor = connections['legacy'].cursor() - return cursor - except ConnectionDoesNotExist: - print("Legacy database is not configured") - print((connections._databases)) - return None - - -def clean_ascii(text): - return ''.join([i if ord(i) < 128 else '' for i in text]) - - -def import_users(delete=False): - if (delete): - models.Event.objects.get(is_rig=False).delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT `id`, `login`, `email`, `first_name`, `last_name`, `verified`, `initials`, `phone_number` FROM `users`""" - cursor.execute(sql) - for row in cursor.fetchall(): - try: - object = models.Profile.objects.get(pk=row[0]) - object.first_name = row[3] - object.last_name = row[4] - object.initials = row[6] - object.phone = row[7] - object.save() - print(("Updated " + str(object))) - except ObjectDoesNotExist: - object = models.Profile(pk=row[0], username=row[1], email=row[2], first_name=row[3], last_name=row[4], - is_active=row[5], initials=row[6], phone=row[7]) - object.set_password(uuid.uuid4().hex) - object.save() - print(("Created " + str(object))) - - -def import_people(delete=False): - if (delete): - models.Person.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT `id`, `name`, `phone`, `email`, `address`, `status` FROM `people`""" - cursor.execute(sql) - resp = cursor.fetchall() - for row in resp: - pk = row[0] - name = clean_ascii(row[1]) - phone = clean_ascii(row[2].replace(' ', '')) - address = clean_ascii(row[4]) - email = clean_ascii(row[3]) - fix_email(email) - - notes = "" - if row[5] != "Normal": - notes = row[5] - - print(("Trying %s %s %s" % (pk, name, phone))) - person, created = models.Person.objects.get_or_create(pk=pk, name=name, phone=phone, email=email, - address=address, notes=notes) - if created: - print(("Created: " + person.__str__())) - with reversion.create_revision(): - person.save() - else: - print(("Found: " + person.__str__())) - - -def import_organisations(delete=False): - if (delete): - models.Organisation.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT `id`, `name`, `phone`, `address`, `union_account`, `status` FROM `organisations`""" - cursor.execute(sql) - for row in cursor.fetchall(): - notes = "" - if row[5] != "Normal": - notes = row[5] - - object, created = models.Organisation.objects.get_or_create(pk=row[0], name=row[1], phone=row[2], - address=row[3], - union_account=row[4], notes=notes) - if created: - print(("Created: " + object.__str__())) - with reversion.create_revision(): - object.save() - else: - print(("Found: " + object.__str__())) - - -def import_vat_rates(delete=False): - if (delete): - models.VatRate.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT `id`, `start_date`, `start_time`, `comment`, `rate` FROM `vat_rates`""" - cursor.execute(sql) - for row in cursor.fetchall(): - start_at = datetime.datetime.combine(row[1], row[2]) - object, created = models.VatRate.objects.get_or_create(pk=row[0], start_at=start_at, - comment=row[3], rate=row[4]) - if created: - print(("Created: " + object.__str__())) - with reversion.create_revision(): - object.save() - else: - print(("Found: " + object.__str__())) - - -def import_venues(delete=False): - if delete: - models.Venue.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT `venue`, `threephasepower` FROM `eventdetails` WHERE `venue` IS NOT NULL GROUP BY `venue`""" - cursor.execute(sql) - for row in cursor.fetchall(): - name = row[0].strip() - print(("Searching for %s", name)) - try: - object = models.Venue.objects.get(name__iexact=name) - if not object.three_phase_available and row[1]: - with reversion.create_revision(): - object.three_phase_available = row[1] - object.save() - except ObjectDoesNotExist: - with reversion.create_revision(): - object = models.Venue(name=name, three_phase_available=row[1]) - object.save() - - -def import_rigs(delete=False): - if delete: - models.Event.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT r.id, event, person_id, organisation_id, venue, description, status, start_date, start_time, end_date, end_time, access_date, access_time, meet_date, meet_time, meet_info, based_on_id, based_on_type, dry_hire, user_id, payment_method, order_no, payment_received, collectorsid FROM eventdetails AS e INNER JOIN rigs AS r ON e.describable_id = r.id WHERE describable_type = 'Rig' AND `venue` IS NOT NULL""" - cursor.execute(sql) - for row in cursor.fetchall(): - print(row) - person = models.Person.objects.get(pk=row[2]) - if row[3]: - organisation = models.Organisation.objects.get(pk=row[3]) - else: - organisation = None - venue = models.Venue.objects.get(name__iexact=row[4].strip()) - status = { - 'Booked': models.Event.BOOKED, - 'Provisional': models.Event.PROVISIONAL, - 'Cancelled': models.Event.CANCELLED, - } - mic = models.Profile.objects.get(pk=row[19]) - if row[16] and row[17] == "Rig": - try: - based_on = models.Event.objects.get(pk=row[16]) - except ObjectDoesNotExist: - based_on = None - else: - based_on = None - with reversion.create_revision(): - try: - object = models.Event.objects.get(pk=row[0]) - except ObjectDoesNotExist: - object = models.Event(pk=row[0]) - object.name = clean_ascii(row[1]) - object.person = person - object.organisation = organisation - object.venue = venue - object.notes = clean_ascii(row[5]) - object.status = status[row[6]] - object.start_date = row[7] - object.start_time = row[8] - object.end_date = row[9] - object.end_time = row[10] - if row[11] and row[12]: - object.access_at = datetime.datetime.combine(row[11], row[12]) - if row[13] and row[14]: - object.meet_at = datetime.datetime.combine(row[13], row[14]) - object.meet_info = row[15] - object.based_on = based_on - object.dry_hire = row[18] - object.is_rig = True - object.mic = mic - object.payment_method = row[20] - object.purchase_order = row[21] - object.payment_received = row[22] - object.collector = row[23] - if object.dry_hire and object.end_date < datetime.date.today(): - object.checked_in_by = mic - object.save() - - -def import_eventitem(delete=True): - if delete: - models.EventItem.objects.all().delete() - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT i.id, r.id, i.name, i.description, i.quantity, i.cost, i.sortorder FROM rig_items AS i INNER JOIN eventdetails AS e ON i.eventdetail_id = e.id INNER JOIN rigs AS r ON e.describable_id = r.id""" - cursor.execute(sql) - for row in cursor.fetchall(): - print(row) - try: - event = models.Event.objects.get(pk=row[1]) - except ObjectDoesNotExist: - continue - try: - object = models.EventItem.objects.get(pk=row[0]) - except ObjectDoesNotExist: - object = models.EventItem(pk=row[0]) - object.event = event - object.name = clean_ascii(row[2]) - object.description = clean_ascii(row[3]) - object.quantity = row[4] - object.cost = row[5] - object.order = row[6] if row[6] else 0 - object.save() - with reversion.create_revision(): - event.save() - - -def import_nonrigs(delete=False): - if (delete): - try: - models.Event.objects.filter(is_rig=False).delete() - except BaseException: - pass - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT name, start_date, start_time, end_date, end_time, description, user_id FROM non_rigs WHERE active = 1;""" - cursor.execute(sql) - for row in cursor.fetchall(): - print(row) - mic = models.Profile.objects.get(pk=row[6]) - object = models.Event() - object.name = row[0] - object.start_date = row[1] - object.start_time = row[2] - object.end_date = row[3] - object.end_time = row[4] - object.description = row[5] - object.is_rig = False - object.mic = mic - print(object) - object.save() - - -def import_invoices(delete=False): - if delete: - try: - models.Invoice.objects.all().delete() - models.Payment.objects.all().delete() - except BaseException: - pass - cursor = setup_cursor() - if cursor is None: - return - sql = """SELECT id, rig_id, invoice_date, payment_date, amount FROM invoices""" - cursor.execute(sql) - for row in cursor.fetchall(): - print(row) - print(row[1]) - try: - event = models.Event.objects.get(pk=row[1]) - except ObjectDoesNotExist: - print("Event %d not found" % row[1]) - continue - print(event) - - try: - invoice = models.Invoice.objects.get(event=event) - except ObjectDoesNotExist: - invoice = models.Invoice(pk=row[0], event=event) - invoice.save() - invoice.invoice_date = row[2] - invoice.save() - print(invoice) - - if row[3]: - try: - payment = models.Payment.objects.get(invoice=invoice) - except ObjectDoesNotExist: - payment = models.Payment(invoice=invoice) - if row[4] >= event.sum_total: - payment.amount = event.sum_total - else: - payment.amount = row[4] - payment.date = row[3] - payment.save() - print(payment) - - if invoice.invoice_date < (datetime.date.today() - datetime.timedelta(days=365)) and invoice.balance: - p2 = models.Payment(amount=invoice.balance) - p2.invoice = invoice - p2.method = payment.ADJUSTMENT - p2.date = datetime.date.today() - p2.save() - - -@transaction.atomic -def main(): - # processs = [] - # processs.append(Process(target=import_users)) - # processs.append(Process(target=import_people, args=(True,))) - # processs.append(Process(target=import_organisations, args=(True,))) - # processs.append(Process(target=import_vat_rates, args=(True,))) - # processs.append(Process(target=import_venues, args=(True,))) - - # # Start all processs - # [x.start() for x in processs] - # # Wait for all processs to finish - # [x.join() for x in processs] - - import_users() - import_people(True) - import_organisations(True) - import_vat_rates(True) - import_venues(True) - - import_rigs(True) - import_eventitem(True) - import_invoices(True) - - # Do this before doing non rigs else it gets ugly - sql = "SELECT setval(\'\"RIGS_%s_id_seq\"\', (SELECT MAX(id) FROM \"RIGS_%s\"));" % ('event', 'event') - cursor = connections['default'].cursor() - cursor.execute(sql) - import_nonrigs(False) - - sequences = ['profile', 'person', 'organisation', 'vatrate', 'venue', 'event', 'eventitem', 'invoice', 'payment'] - for seq in sequences: - sql = "SELECT setval(\'\"RIGS_%s_id_seq\"\', (SELECT MAX(id) FROM \"RIGS_%s\"));" % (seq, seq) - cursor = connections['default'].cursor() - cursor.execute(sql) - - -if __name__ == "__main__": - main() diff --git a/package.json b/package.json index ad64ee6d..698c49e0 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "konami": "^1.6.2", "moment": "^2.24.0", "popper.js": "^1.16.1", - "raven-js": "^3.27.2", + "raven-js": "^3.27.2" }, "devDependencies": { "browser-sync": "^2.26.7", @@ -28,6 +28,6 @@ "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.2.0", "node-sass": "^4.13.1", - "gulp-flatten": "^0.4.0", + "gulp-flatten": "^0.4.0" } } diff --git a/templates/base.html b/templates/base.html index 92ee0296..92d740ee 100644 --- a/templates/base.html +++ b/templates/base.html @@ -14,8 +14,7 @@ - + {% block css %} @@ -81,7 +80,6 @@ return yyyy + '-' + (mm[1] ? mm : "0" + mm[0]) + '-' + (dd[1] ? dd : "0" + dd[0]); // padding }; - diff --git a/templates/base_embed.html b/templates/base_embed.html index bd0f381e..0807e453 100644 --- a/templates/base_embed.html +++ b/templates/base_embed.html @@ -11,13 +11,11 @@ - + - + @@ -25,7 +23,6 @@ {% include "analytics.html" %} -
{% if messages %} @@ -42,7 +39,6 @@ {% endblock %}
- {% block js %} {% endblock %}