GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Reservation.get_reserved_days_for_period()   B
last analyzed

Complexity

Conditions 5

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
c 1
b 0
f 0
dl 0
loc 35
rs 8.0894
1
# -*- coding: utf-8 -*-
2
import datetime
3
4
from django.conf import settings
5
from django.core.urlresolvers import reverse
6
from django.db import models
7
from django.db.models import Q
8
from django.db.models.signals import post_save
9
from django.dispatch import receiver
10
from django.utils.translation import ugettext_lazy as _
11
12
from reservable_pricing.models import PeriodPriceModifier
13
from reservations.notify_events import ReservationsOrderReceived, get_order_details
14
from shoop.core.models import Product, Order, OrderLine
15
from shoop.core.models._orders import OrderStatusRole
16
from shoop.front.signals import order_creator_finished
17
18
19
class ReservableProduct(models.Model):
20
    """Products that have reservable properties."""
21
22
    product = models.OneToOneField(Product, verbose_name=_(u"reservable product"), related_name="reservable")
23
    check_out_time = models.TimeField(verbose_name=_(u"sign out time"), default=datetime.time(hour=12))
24
    check_in_time = models.TimeField(verbose_name=_(u"sign in time"), default=datetime.time(hour=15))
25
    available_count = models.IntegerField(verbose_name=_(u"available quantity"), default=1)
26
    pricing_per_person = models.BooleanField(verbose_name=_("pricing per person"), default=False)
27
    pricing_per_person_included = models.PositiveIntegerField(
28
        verbose_name=_("people included in price"), null=True, blank=True,
29
    )
30
    pricing_per_person_price = models.DecimalField(
31
        verbose_name=_("price per person"), null=True, blank=True, decimal_places=2, max_digits=6,
32
    )
33
    sort_order = models.PositiveIntegerField(verbose_name=_(u"sort order"), default=50)
34
35
    class Meta:
36
        verbose_name = _('reservable product')
37
        verbose_name_plural = _('reservable products')
38
        ordering = ("sort_order",)
39
40
    def __str__(self):
41
        return self.product.safe_translation_getter("name") or self.product.sku
42
43
    def get_reserved_dates(self, start, end):
44
        """Get a list of reserved dates, between and including start and end.
45
46
        Args:
47
            start (date)
48
            end (date)
49
50
        Returns:
51
            list of dates or []
52
        """
53
        return Reservation.get_reserved_days_for_period(start, end, self)
54
55
    def is_period_days_free(self, start, end):
56
        """Check if period is free."""
57
        return len(self.get_reserved_dates(start, end)) == 0
58
59
    @property
60
    def has_price_modifiers(self):
61
        """Check if this reservable has price modifiers.
62
63
        Returns:
64
            True or False
65
        """
66
        if self.pricing_per_person:
67
            return True
68
        if self.period_price_modifiers.exists():
69
            return True
70
        return False
71
72
    @property
73
    def period_price_modifiers(self):
74
        future_period_modifiers = PeriodPriceModifier.objects.filter(
0 ignored issues
show
Bug introduced by
The Class PeriodPriceModifier does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
75
            product=self.product, start_date__gte=datetime.date.today()).order_by("start_date")
76
        return future_period_modifiers
77
78
79
class Reservation(models.Model):
80
    """A single reservation."""
81
82
    reservable = models.ForeignKey(
83
        ReservableProduct, verbose_name=_(u"reservable product"), related_name="reservations")
84
    order_line = models.OneToOneField(
85
        OrderLine, verbose_name=_("order line"), related_name="reservation", null=True, blank=True)
86
    start_time = models.DateTimeField(verbose_name=_(u"starts"))
87
    end_time = models.DateTimeField(verbose_name=_(u"ends"))
88
    persons = models.IntegerField(verbose_name=_(u"persons"), default=1)
89
90
    class Meta:
91
        verbose_name = _('reservation')
92
        verbose_name_plural = _('reservations')
93
94
    def __str__(self):
95
        return str(self.reservable)
96
97
    def save(self, *args, **kwargs):
98
        # Validate end_time is past start_time
99
        if self.end_time <= self.start_time:
100
            raise ValueError
101
        return super(Reservation, self).save(*args, **kwargs)
102
103
    @staticmethod
104
    def get_reserved_days_for_period(start_date, end_date, reservable=None):
105
        """Get a list of reserved dates, between and including start and end.
106
107
        Args:
108
            start_date (date)
109
            end_date (date)
110
            reservable (ReservableProduct, optional)    - optionally filter by reservable
111
112
        Returns:
113
            list of dates or []
114
        """
115
        reservations = Reservation.objects.filter(
0 ignored issues
show
Bug introduced by
The Class Reservation does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
116
            start_time__gte=start_date, end_time__lte=end_date,
117
        )
118
        reservations = reservations | Reservation.objects.filter(
0 ignored issues
show
Bug introduced by
The Class Reservation does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
119
            Q(start_time__range=(start_date, end_date)) | Q(end_time__range=(start_date, end_date))
120
        )
121
        reservations = reservations | Reservation.objects.filter(
0 ignored issues
show
Bug introduced by
The Class Reservation does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
122
            (
123
                Q(start_time__lt=start_date) & Q(end_time__gte=start_date)
124
            ) |
125
            (
126
                Q(start_time__lte=end_date) & Q(end_time__gt=end_date)
127
            )
128
        )
129
        if reservable:
130
            reservations = reservations.filter(reservable=reservable)
131
        dates = []
132
        for reservation in reservations.distinct():
133
            current = max(reservation.start_time.date(), start_date)
134
            while current < reservation.end_time.date() and current <= end_date:
135
                dates.append(current)
136
                current += datetime.timedelta(days=1)
137
        return dates
138
139
140
@receiver(order_creator_finished)
141
def send_order_received_notification(sender, **kwargs):
142
    order = kwargs["order"]
143
    request = kwargs["request"]
144
    ReservationsOrderReceived(
0 ignored issues
show
Bug introduced by
The Instance of ReservationsOrderReceived does not seem to have a member named run.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
145
        order=order,
146
        order_id=order.id,
147
        order_details=get_order_details(order),
148
        order_url="%s%s" % (
149
            settings.KAKARAVAARA_SITE_URL, reverse("shoop:order_complete", kwargs={"pk": order.pk, "key": order.key})
150
        ),
151
        customer_email=order.email,
152
        customer_phone=order.phone,
153
        customer_name=order.billing_address.name if order.billing_address else "",
154
        language=request.LANGUAGE_CODE,
155
        additional_notes=order.customer_comment,
156
        total_sum=order.taxful_total_price_value,
157
    ).run()
158
159
160
@receiver(post_save, sender=Order)
161
def order_post_save(sender, instance, **kwargs):
162
    if instance.status.role == OrderStatusRole.CANCELED:
163
        reservations = Reservation.objects.filter(order_line__order=instance)
0 ignored issues
show
Bug introduced by
The Class Reservation does not seem to have a member named objects.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
164
        for reservation in reservations:
165
            reservation.delete()
166