diff --git a/PyRIGS/tests/base.py b/PyRIGS/tests/base.py index 96ea899e..b1f12fec 100644 --- a/PyRIGS/tests/base.py +++ b/PyRIGS/tests/base.py @@ -71,7 +71,7 @@ def screenshot_failure_cls(cls): # Checks if animation is done -class animation_is_finished(): +class animation_is_finished: def __call__(self, driver): numberAnimating = driver.execute_script('return $(":animated").length') finished = numberAnimating == 0 diff --git a/RIGS/forms.py b/RIGS/forms.py index b3c68ce6..a04df9b4 100644 --- a/RIGS/forms.py +++ b/RIGS/forms.py @@ -202,7 +202,8 @@ class EventChecklistForm(forms.ModelForm): } # Two possible formats - def parsedatetime(self, date_string): + @staticmethod + def parsedatetime(date_string): try: return timezone.make_aware(datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S')) except ValueError: diff --git a/RIGS/ical.py b/RIGS/ical.py index 3940390b..09f2dba9 100644 --- a/RIGS/ical.py +++ b/RIGS/ical.py @@ -9,6 +9,69 @@ import datetime import pytz +def item_guid(item): # use the rig-id as the ical unique event identifier + return item.pk + + +def item_updated(item): # some ical clients will display this + return item.last_edited_at + + +def item_location(item): + return item.venue + + +def item_end_datetime(item): + if isinstance(item.latest_time, datetime.date): # Ical end_datetime is non-inclusive, so add a day + return item.latest_time + datetime.timedelta(days=1) + + return item.latest_time + + +def item_start_datetime(item): + return item.earliest_time + + +def items(params): + # include events from up to 1 year ago + start = datetime.datetime.now() - datetime.timedelta(days=365) + filter = Q(start_date__gte=start) + + typeFilters = Q(pk=None) # Need something that is false for every entry + + if params['dry-hire']: + typeFilters = typeFilters | Q(dry_hire=True, is_rig=True) + + if params['non-rig']: + typeFilters = typeFilters | Q(is_rig=False) + + if params['rig']: + typeFilters = typeFilters | Q(is_rig=True, dry_hire=False) + + statusFilters = Q(pk=None) # Need something that is false for every entry + + if params['cancelled']: + statusFilters = statusFilters | Q(status=models.Event.CANCELLED) + if params['provisional']: + statusFilters = statusFilters | Q(status=models.Event.PROVISIONAL) + if params['confirmed']: + statusFilters = statusFilters | Q(status=models.Event.CONFIRMED) | Q(status=models.Event.BOOKED) + + filter = filter & typeFilters & statusFilters + + return models.Event.objects.filter(filter).order_by('-start_date').select_related('person', 'organisation', + 'venue', 'mic') + + +def description(params): + desc = "Calendar generated by RIGS system. This includes event types: " + ('Rig, ' if params['rig'] else '') + ( + 'Non-rig, ' if params['non-rig'] else '') + ('Dry Hire ' if params['dry-hire'] else '') + '\n' + desc = desc + "Includes events with status: " + ('Cancelled, ' if params['cancelled'] else '') + ( + 'Provisional, ' if params['provisional'] else '') + ('Confirmed/Booked, ' if params['confirmed'] else '') + + return desc + + class CalendarICS(ICalFeed): """ A simple event calender @@ -39,44 +102,6 @@ class CalendarICS(ICalFeed): return params - def description(self, params): - desc = "Calendar generated by RIGS system. This includes event types: " + ('Rig, ' if params['rig'] else '') + ( - 'Non-rig, ' if params['non-rig'] else '') + ('Dry Hire ' if params['dry-hire'] else '') + '\n' - desc = desc + "Includes events with status: " + ('Cancelled, ' if params['cancelled'] else '') + ( - 'Provisional, ' if params['provisional'] else '') + ('Confirmed/Booked, ' if params['confirmed'] else '') - - return desc - - def items(self, params): - # include events from up to 1 year ago - start = datetime.datetime.now() - datetime.timedelta(days=365) - filter = Q(start_date__gte=start) - - typeFilters = Q(pk=None) # Need something that is false for every entry - - if params['dry-hire']: - typeFilters = typeFilters | Q(dry_hire=True, is_rig=True) - - if params['non-rig']: - typeFilters = typeFilters | Q(is_rig=False) - - if params['rig']: - typeFilters = typeFilters | Q(is_rig=True, dry_hire=False) - - statusFilters = Q(pk=None) # Need something that is false for every entry - - if params['cancelled']: - statusFilters = statusFilters | Q(status=models.Event.CANCELLED) - if params['provisional']: - statusFilters = statusFilters | Q(status=models.Event.PROVISIONAL) - if params['confirmed']: - statusFilters = statusFilters | Q(status=models.Event.CONFIRMED) | Q(status=models.Event.BOOKED) - - filter = filter & typeFilters & statusFilters - - return models.Event.objects.filter(filter).order_by('-start_date').select_related('person', 'organisation', - 'venue', 'mic') - def item_title(self, item): title = '' @@ -98,18 +123,6 @@ class CalendarICS(ICalFeed): return title - def item_start_datetime(self, item): - return item.earliest_time - - def item_end_datetime(self, item): - if isinstance(item.latest_time, datetime.date): # Ical end_datetime is non-inclusive, so add a day - return item.latest_time + datetime.timedelta(days=1) - - return item.latest_time - - def item_location(self, item): - return item.venue - def item_description(self, item): # Create a nice information-rich description # note: only making use of information available to "non-keyholders" @@ -158,8 +171,3 @@ class CalendarICS(ICalFeed): # def item_created(self, item): #TODO - Implement created date-time (using django-reversion?) - not really necessary though # return '' - def item_updated(self, item): # some ical clients will display this - return item.last_edited_at - - def item_guid(self, item): # use the rig-id as the ical unique event identifier - return item.pk diff --git a/RIGS/templatetags/filters.py b/RIGS/templatetags/filters.py index ba004024..d923bd53 100644 --- a/RIGS/templatetags/filters.py +++ b/RIGS/templatetags/filters.py @@ -66,7 +66,7 @@ def paginator(context, adjacent_pages=3): if endPage >= paginator.num_pages - 1: endPage = paginator.num_pages + 1 page_numbers = [n for n in range(startPage, endPage) - if n > 0 and n <= paginator.num_pages] + if 0 < n <= paginator.num_pages] dict = { 'request': context['request'], diff --git a/assets/management/commands/deleteSampleData.py b/assets/management/commands/deleteSampleData.py index cdf34ce9..c8d9eea9 100644 --- a/assets/management/commands/deleteSampleData.py +++ b/assets/management/commands/deleteSampleData.py @@ -3,6 +3,11 @@ from django.core.management.base import BaseCommand, CommandError from assets import models +def delete_objects(model): + for object in model.objects.all(): + object.delete() + + class Command(BaseCommand): help = 'Deletes testing sample data' @@ -12,12 +17,8 @@ class Command(BaseCommand): if not (settings.DEBUG): raise CommandError('You cannot run this command in production') - self.delete_objects(models.AssetCategory) - self.delete_objects(models.AssetStatus) - self.delete_objects(models.Supplier) - self.delete_objects(models.Connector) - self.delete_objects(models.Asset) - - def delete_objects(self, model): - for object in model.objects.all(): - object.delete() + delete_objects(models.AssetCategory) + delete_objects(models.AssetStatus) + delete_objects(models.Supplier) + delete_objects(models.Connector) + delete_objects(models.Asset) diff --git a/requirements.txt b/requirements.txt index 00ad4091..6ba7b2a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,7 +53,7 @@ pytest-django==4.1.0 pytest-xdist==2.2.0 pytest-cov==2.11.1 raven==6.10.0 -reportlab==3.5.60 +reportlab==3.5.59 requests==2.25.1 retrying==1.3.3 selenium==3.141.0