Exemplo n.º 1
0
def create_appointment(request, barber):
    barber = get_object_or_404(Barber, pk=barber)
    if request.method == 'POST':
        form = CreateAppointmentForm(request.POST)
        if form.is_valid():
            duration = form.cleaned_data['duration']
            date = form.cleaned_data['date']
            appointment = Appointment(customer=form.cleaned_data['customer'], barber=barber, comment=form.cleaned_data['comment'])
            appointment.save() # TODO: Try-Except
            for category in ProductCategory.objects.filter(service=True):
                if form.cleaned_data['show_{}'.format(category.id)]:
                    order = OrderDetail.objects.create(category=category, product=form.cleaned_data['service_{}'.format(category.id)], quantity=1, cost=form.cleaned_data['cost_{}'.format(category.id)], date=date, barber=barber, customer=form.cleaned_data['customer'], appointment_fk=appointment)
                    appointment.orders.add(order)
            event = Event(start=date, end=date+timedelta(hours=int(duration)))
            event.save()
            calendar = Calendar.objects.get(name='client_schedule')
            calendar.events.add(event)
            relation = EventRelation.objects.create_relation(event, appointment)
            relation.save()
        else:
            date =datetime.now() # Ugly as shit.
    else:
        date = make_aware(datetime.strptime(request.GET['date'], '%a, %d %b %Y %H:%M:%S %Z'), utc).astimezone(timezone(settings.TIME_ZONE))
        form = CreateAppointmentForm(date=date, barber=barber)
    context = dict(
        admin.site.each_context(request),
        barber=barber,
        form=form,
        time='{}-00'.format(date.hour),
    )
    return render(request, 'admin/create_appointment.html', context)
Exemplo n.º 2
0
def monthly_schedule(request, year, month):
    if int(year) > 2037 or int(year) < 1970 or int(month) < 1 or int(month) > 12:
        raise Http404

    MonthlyScheduleFormset = formset_factory(wraps(MonthlyScheduleForm)(partial(MonthlyScheduleForm, days=monthrange(int(year), int(month))[1])), extra=0)

    initial_data = []
    for barber in Barber.objects.all():
        data = {}
        calendar = Calendar.objects.get_or_create(name='barber_schedule')[0]
        month_period = Month(calendar.events.get_for_object(barber), datetime(int(year), int(month), 1))
        for day_period in month_period.get_days():
            if day_period.has_occurrences():
                data['day_{}'.format(day_period.start.day)] = True
        initial_data.append(data)

    if request.method == 'POST':
        formset = MonthlyScheduleFormset(request.POST, initial=initial_data)
        if formset.is_valid():
            for form, barber in zip(formset, Barber.objects.all()):
                for day in form.changed_data:
                    if not form.cleaned_data[day]:
                        calendar = Calendar.objects.get(name='barber_schedule')
                        events = calendar.events.get_for_object(barber)
                        period = Day(events, datetime(int(year), int(month), int(day[4:])))
                        if period.has_occurrences():
                            for occurrence in period.get_occurrences():
                                Event.objects.get(id=occurrence.event_id).delete()
                    else:
                        calendar = Calendar.objects.get_or_create(name='barber_schedule')[0]
                        event = Event(
                            start=make_aware(datetime(int(year), int(month), int(day[4:]), settings.DAY_START)),
                            end=make_aware(datetime(int(year), int(month), int(day[4:]), settings.DAY_END))
                        )
                        event.save()
                        calendar.events.add(event)
                        relation = EventRelation.objects.create_relation(event, barber)
                        relation.save()

    else:
        formset = MonthlyScheduleFormset(initial=initial_data)

    context = dict(
        admin.site.each_context(request),
        days=range(1, monthrange(int(year), int(month))[1] + 1),
        first_weekday=monthrange(int(year), int(month))[0],
        barbers=zip(Barber.objects.all(), formset),
        formset=formset,
        prev_date=(datetime(int(year), int(month), 1) - timedelta(days=1)),
        current_date=datetime.now(),
        next_date=(datetime(int(year), int(month), monthrange(int(year), int(month))[1]) + timedelta(days=1)),
    )
    if request.method == 'POST':
        return redirect(reverse('admin:monthly_schedule', kwargs={'year': year, 'month': month}), context)
    else:
        return render(request, 'admin/monthly_schedule.html', context)
Exemplo n.º 3
0
 def save(self, *args, **kwargs):
     get = self.cleaned_data.get
     print get('event_start')
     
     item = Item.objects.get(pk=kwargs['task_id'])
     
     calendar = Calendar.objects.get(slug='example')
     
     d = get('event_start')
     start_date = datetime.datetime(d.year, d.month, d.day, 8)
     end_date = datetime.datetime(d.year, d.month, d.day, 9)
     e = Event(calendar=calendar,
       creator=User.objects.get(pk=1),
       start=start_date,
       end=end_date,
       title=item.title,
       item=item
     )
     e.save()
Exemplo n.º 4
0
    def save(self, *args, **kwargs):
        m = kwargs.pop('message', None)
        request = kwargs.pop('request', None)
        try:
            calendar = Calendar.objects.get(name='default')
        except Calendar.DoesNotExist:
            calendar = Calendar(name='default', slug='default')
            calendar.save()

        if self.instance.pk:
            self.instance.event.title = self.cleaned_data['title']
            self.instance.event.start = self.cleaned_data['start']
            self.instance.event.end = self.cleaned_data['end']
            self.instance.event.save()
            return self.instance.event
        else:
            event_data = {
                'title': self.cleaned_data['title'],
                'start': self.cleaned_data['start'],
                'end': self.cleaned_data['end'],
                'description': m.message,
                'creator': request.user,
                'calendar': calendar,
            }
            event = Event(**event_data)
            event.save()
            EventDetails.objects.create_details(event)
            ec = EventCommunity(event=event)
            ec.save()
            for cal_owner in m.users.all():
                cal = get_personal_calendar(cal_owner)
                event.create_relation(cal.content_object)

            for cal_owner in m.communities.all():
                cal = get_community_calendar(cal_owner)
                event.create_relation(cal.content_object)
            return ec
Exemplo n.º 5
0
def booking5(request, date, slot, contractor_id):
    '''
    Actual booking takes place
    '''
    #found first contractor so save it to earliest possible time
    # find first available time
    try:
        start = date = datetime.datetime.strptime(date, '%Y-%m-%d')
    except:
        start = date + datetime.timedelta(days=1)
    end = start + datetime.timedelta(days=1)
    contractor = MyUser.objects.get(id=contractor_id)

    url = 'https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=' + request.session[
        'postcode'] + '&destinations=' + contractor.post_code + '&key=' + GOOGLE_MAPS_DIRECTIONS_KEY
    result = simplejson.load(urllib.urlopen(url))
    travel_time = int(
        result['rows'][0]['elements'][0]['duration']['value'] / 60) * 2
    job_time = travel_time + request.session['site_time']

    start_time = contractor.checktime(slot, start, job_time)
    if start_time == 'None':
        #we need to handle the slot being lost
        messages.warning(
            request,
            'Timeslot has been taken since we started the process.  Please select another.'
        )
        return booking2(request)

    event = Event(start=start_time,
                  end=start_time + datetime.timedelta(minutes=job_time),
                  title="Change The Locks: " + request.session['postcode'],
                  description=request.session['postcode'],
                  calendar=contractor.calendar)
    event.save()
    job = Job(customer=request.user,
              event=event,
              housenumber=request.session['address'][0],
              street=request.session['address'][1],
              city=request.session['address'][2],
              post_code=request.session['address'][3],
              additional_info=request.session['additional_info'],
              deposit=request.session['deposit'])
    job.save()
    for q in request.session['qwerty']:
        try:
            job_item = Job_Item.objects.get(job=job,
                                            item=Item.objects.get(id=q[0]))
        except:
            job_item = Job_Item(job=job, item=Item.objects.get(id=q[0]))
        job_item.count = q[2]
        job_item.save()

    stripe.api_key = STRIPE_API_KEY
    token = request.POST['stripeToken']

    try:
        mycustomer = Customer.objects.get(user=request.user)
    except:
        mycustomer = Customer(user=request.user)
        mycustomer.save()
    if not mycustomer.stripe_id:
        # create the customer
        customer = stripe.Customer.create(
            email=request.user.email,
            source=token,
        )

        # save customer stripe id
        mycustomer.stripe_id = customer.id
        mycustomer.save()

    #create customer link for contractor
    token = stripe.Token.create(
        customer=mycustomer.stripe_id,
        stripe_account=contractor.stripe_user_id,
    )

    # Create the charge on Stripe's servers - this will charge the user's card
    try:
        charge = stripe.Charge.create(
            amount=int(request.session['deposit'] *
                       100),  # amount in cents, again
            currency="gbp",
            #customer=mycustomer.stripe_id,
            source=token.id,
            description="Change The Locks",
            application_fee=int((request.session['deposit'] * 100) *
                                CHANGE_THE_LOCKS_PERCENTAGE / 100),
            stripe_account=contractor.stripe_user_id,
        )
    except stripe.error.CardError, e:
        # The card has been declined so clear down the recently added records
        job.delete()
        event.delete()
        job_items = Job_Item.objects.filter(job=job)
        for job_item in job_items:
            job_item.delete()
        variables['e'] = e
        return render(request, 'stripe/payment_declined.html', variables)