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)
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)
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()
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
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)