Example #1
0
def record_form(request, hour):
    day = request.session['selected_day']
    user = get_current_user(request)

    if request.method == 'POST':
        form = RecordCreateForm(request.POST)

        if form.is_valid():
            cd = form.cleaned_data

            record = RPRecord()
            record.user = get_current_user(request)
            service = RPService.objects.get(id=int(cd['service']))

            record.service = service

            h,m = cd['start_time'].split(':')
            s_date = datetime(day.year, day.month, day.day, int(h), int(m))
            record.start_datetime = s_date

            h,m = cd['stop_time'].split(':')
            s_date = datetime(day.year, day.month, day.day, int(h), int(m))
            record.stop_datetime = s_date
            record.comment = cd['comment']

            #check duble-record
            finded = RPRecord.objects.filter(start_datetime__gt=datetime(day.year, day.month, day.day,0,0), stop_datetime__lt=datetime(day.year, day.month, day.day,23,59), user=record.user)
            if finded:
                st_dt = finded[0].start_datetime
                en_dt = finded[0].stop_datetime
                start_time = '%.02i:%.02i'%(st_dt.hour, st_dt.minute)
                stop_time = '%.02i:%.02i'%(en_dt.hour, en_dt.minute)
                return inform_message(_(u'Ви вже записані на цей день з %(start_time)s до %(stop_time)s. Якщо бажаєте змінити час запису, то відмініть ваш прийом, а потім запишіться на інший час') % {'start_time': unicode(start_time), 'stop_time' : unicode(stop_time)}, redirect_link='/my_records/')


            res = record.stop_datetime - record.start_datetime
            cost = ((res.seconds/60.0) / ATOM_TIME) * service.atom_money

            #check current user balance
            if user.balance < cost:
                return inform_message(_(u'У вас недостатньо коштів для запису. Поповніть, будь ласка, свій рахунок '), '/my_balance')

            record.user.balance -= cost

            try:
                record.user.save()
                record.save()
            except Exception, err:
                transaction.rollback()
                raise err
            else:
                transaction.commit()

            return inform_message(_(u'Ви успішно записались на прийом з %(start_time)s до %(stop_time)s. Вартість послуги - %(cost)i гривень') % {'start_time': unicode(cd['start_time']), 'stop_time': unicode(cd['stop_time']), 'cost': int(cost)}, redirect_link='/my_records/')

        raise Exception('Record form data is not valid')
Example #2
0
def get_user_records(request):
    user = get_current_user(request)

    records = RPRecord.objects.filter(user=user).order_by('-start_datetime')

    now = datetime.now()
    for record in records:
        if record.start_datetime <= now:
            record.is_past = True
        else:
            record.is_past = False

    user = get_current_user(request)
    return render_to_response('user_records_form.html',locals())
Example #3
0
def get_messages(request):
    user = get_current_user(request)

    is_outbox = request.REQUEST.get('is_outbox',None)
    full_message_id = request.REQUEST.get('msg_id',None)

    if is_outbox:
        messages = RPMessage.objects.filter(sender=user).order_by('-send_datetime')
    else:
        messages = RPMessage.objects.filter(binded_user=user).order_by('-send_datetime')

    for message in messages:
        if full_message_id and int(full_message_id) == message.id:
            if (not message.is_readed) and (not is_outbox):
                message.is_readed = 1
                message.save()
            continue

        if len(message.message) > 20:
            message.message = message.message.split('\n')[0][0:20]+'  ...'

    messages = [msg for msg in messages]
    if len(messages) < 20:
        for i in xrange(20-len(messages)):
            messages.append(RPMessage())

    return render_to_response('user_messages.html',locals())
Example #4
0
def cancel_record(request, record_id, is_admin=False):
    record = RPRecord.objects.get(id=record_id)

    if is_admin:
        user = record.user
    else:
        user = get_current_user(request)

    if not record:
        raise Exception("Record with ID %s is not found in database!"%record_id)

    if record.user != user:
        raise Exception("It's not your record!!!")

    if not is_admin:
        if record.start_datetime < datetime.now():
            return inform_message(_(u'Не можна відмінити прийом, який вже пройшов (або під час його)!'), '/my_records')

        diff = record.start_datetime - datetime.now()

        if diff.days == 0 and (diff.seconds/60.0 < MIN_CANCEL_TIME):
            return inform_message(_(u'Відмінити прийом можна не менше ніж за %(min_time)i хвилин!')% {'min_time':MIN_CANCEL_TIME}, '/my_records')

    res = record.stop_datetime - record.start_datetime
    cost = ((res.seconds/60.0) / ATOM_TIME) * record.service.atom_money

    #check current user balance
    user.balance += cost

    try:
        record.delete()
        user.save()
    except Exception, err:
        transaction.rollback()
        raise err
Example #5
0
def cancel_past_record(request, record_id):
    record = RPRecord.objects.get(id=record_id)
    message = _(u'Шановний %(name)s, На Ваш віртуальний рахунок була повернена оплата за прийом %(day).02i.%(month).02i%(year)i.\n') % {'name':record.user.name, 'day':record.start_datetime.day, 'month':record.start_datetime.month, 'year':record.start_datetime.year}
    user = get_current_user(request)
    day = '%s/%s/%s'%(record.start_datetime.day, record.start_datetime.month, record.start_datetime.year)

    try:
        cancel_record(request, record_id, is_admin=True)
    except Exception,err:
        raise err
Example #6
0
def services_description(request):
    user = get_current_user(request)

    services = RPService.objects.filter(is_deleted=0)

    part = 60.0 / ATOM_TIME
    for service in services:
        i18n_service(service, request)
        service.hour_money = int( service.atom_money * part )

    return render_to_response('services_description.html',locals())
Example #7
0
def send_message(request):
    if request.method != 'POST':
        raise Exception('POST expected for send_message')

    if not request.POST.has_key('message'):
        raise Exception('message is not found at POST data')

    user = get_current_user(request)
    message = RPMessage(sender=user, binded_user=None, send_datetime=datetime.now(), message=request.POST['message'], is_readed=0)

    message.save()
    return HttpResponse('')
Example #8
0
def delete_service(request, service_id):
    user = get_current_user(request)

    service = RPService.objects.get(id=int(service_id))

    records = RPRecord.objects.filter(stop_datetime__gt=datetime.now(), service=service)

    if records:
        return inform_message(_(u'Видалення послуги неможливе тому, що є заплановані записи на дану послугу!'), '/admin_services')


    service.is_deleted=1
    service.save()

    return inform_message(_(u'Ви успішно видалили послугу!'), '/admin_services')
Example #9
0
def get_liqpay_form(request):
    user = get_current_user(request)
    money_count = request.REQUEST['money']

    money_count = float(money_count)

    l = liqpay.Liqpay(MERCHANT_ID, SIGNATURE)

    #balance = l.get_ballances() # balance['UAH']
    payment = RPPayments(user=user, money=money_count, transaction_start=datetime.now(),transaction_end=None, status=PS_INIT, phone_number='')
    payment.save()

    xml = l.build_merchant_xml(order_id=payment.id, amount=money_count, currency='UAH', description='Psychologist service', pay_way='card', default_phone='', result_url='http://%s/liqpay_redirect/'%hostname, server_url='http://%s/liqpay_response/'%hostname)
    logger.debug('LIQPAY REQUEST:\n%s'%xml.xml)

    enc_xml = xml.encoded_xml
    signature = xml.encoded_signature

    return HttpResponse('%s,%s'%(enc_xml, signature))
Example #10
0
def get_day_calendar(request, day_str):
    day,month,year =  day_str.split('/')
    day,month,year = int(day), int(month), int(year)

    today = date(year, month, day)


    request.session['selected_day'] = today

    day = '%s %i, %s' % ( MONTHS[month], day, year)

    hours_dict = _get_free_ranges(today)
    keys = hours_dict.keys()
    keys.sort()
    hours = [hours_dict[key] for key in keys]

    user = get_current_user(request)


    return render_to_response('day_calendar.html', locals())
Example #11
0
def admin_cancel_record(request, record_id):
    record = RPRecord.objects.get(id=record_id)
    user = get_current_user(request)

    day = '%s/%s/%s'%(record.start_datetime.day, record.start_datetime.month, record.start_datetime.year)

    if request.method == 'POST':
        message = request.POST['message']
        if message.strip() == '':
            return inform_message(_(u'Ви не ввели причину відміни прийому'), '/admin_cancel_record/%s'%record_id)

        message = _(u'Шановний %(name)s, Ваш прийом %(day).02i.%(month).02i.%(year)i було відмінено.\nПричина: %(message)s.\nБудь ласка, виберіть інший час прийому.\nСподіваємося на розуміння.') % {'name':record.user.name, 'day':record.start_datetime.day, 'month':record.start_datetime.month, 'year':record.start_datetime.year, 'message': message}

        try:
            cancel_record(request, record_id, is_admin=True)
        except Exception,err:
            raise err
        else:
            message = RPMessage(sender=user, binded_user=record.user, send_datetime=datetime.now(), message=message, is_readed=0)
            message.save()
        return inform_message(_(u'Ви успішно відмінили прийом'), '/manage_day/%s'%day)
Example #12
0
def manage_day_calendar(request, day_str):
    day,month,year =  day_str.split('/')
    day,month,year = int(day), int(month), int(year)

    today = datetime(year, month, day)

    if today < datetime.today():
        is_past_date = True

    request.session['selected_day'] = today

    day = '%s %i, %s' % ( MONTHS[month], day, year)

    nextday = today + timedelta(1)
    work_ranges = RPWorkTime.objects.filter(start_worktime__gt=today, stop_worktime__lt=nextday).order_by('start_worktime')

    record_ranges = RPRecord.objects.filter(start_datetime__gt=today, stop_datetime__lt=nextday).order_by('start_datetime')

    user = get_current_user(request)

    return render_to_response('manage_day.html', locals())
Example #13
0
def manage_messages(request):
    user = get_current_user(request)
    full_message_id = request.REQUEST.get('msg_id',None)
    is_outbox = request.REQUEST.get('is_outbox',None)

    if is_outbox:
        messages = RPMessage.objects.filter(sender=user).order_by('-send_datetime')[0:100]
    else:
        messages = RPMessage.objects.filter(binded_user=None).order_by('-send_datetime')[0:100]

    for message in messages:
        if full_message_id and int(full_message_id) == message.id:
            if (not message.is_readed) and (not is_outbox):
                message.is_readed = 1
                message.save()
            continue

        if len(message.message) > 20:
            message.message = message.message.split('\n')[0][0:20]+'  ...'


    return render_to_response('manage_messages.html', locals())
Example #14
0
def manage_user(request, user_id):
    m_user = RPUser.objects.get(id=user_id)
    user = get_current_user(request)

    if request.method == 'POST':
        message = request.POST['message']
        if message.strip() == '':
            return inform_message(_(u'Ви не ввели текст повідомлення'), '/manage_user/%s'%user_id)

        message = RPMessage(sender=user, binded_user=m_user, send_datetime=datetime.now(), message=message, is_readed=0)
        message.save()
        return inform_message(_(u'Повідомлення відправлено успішно'), '/manage_user/%s'%user_id)

    payments = RPPayments.objects.filter(user=m_user).order_by('-transaction_end')[:100] #FIXME
    for payment in payments:
        if payment.status == PS_OK:
            payment.status = _(u'Успішно')
        elif payment.status == PS_FAIL:
            payment.status = _(u'Помилка')

    records = RPRecord.objects.filter(user=m_user).order_by('-stop_datetime')[:100] #FIXME

    return render_to_response('manage_user.html', locals())
Example #15
0
def manage_worktime(request):
    class Day:
        def __init__(self, cdate=None):
            self.is_active = False
            self.is_recorded = False

            if not cdate:
                self.num = ''
                self.is_current = False
                self.is_past = False
                return

            self.num = cdate.day

            current = date.today()

            if current == cdate:
                self.is_current = True

            if cdate < current:
                self.is_past = True
            else:
                nextday = cdate + timedelta(1)
                work_ranges = len(RPWorkTime.objects.filter(start_worktime__gt=cdate, stop_worktime__lt=nextday))
                record_ranges = len(RPRecord.objects.filter(start_datetime__gt=cdate, stop_datetime__lt=nextday))
                if work_ranges:
                    self.is_active = True
                if record_ranges:
                    self.is_recorded = True



    class Month:
        def __init__(self, name, num, year):
            self.name = name
            self.weeks = []
            self.num = num
            self.year = year

    cur_date = request.session.get('DATE',None)
    if not cur_date:
        cur_date = date.today()
        cur_date = date(cur_date.year, cur_date.month, 1)
        request.session['DATE'] = cur_date

    month = Month(MONTHS[cur_date.month], cur_date.month, cur_date.year)

    weeks = []
    start_idx = cur_date.weekday()
    week = [Day() for i in xrange(start_idx)]
    cur_month = cur_date.month
    while cur_month == cur_date.month:
        week.append(Day(cur_date))
        if len(week) == 7:
            weeks.append(week)
            week = []
        cur_date = cur_date + timedelta(1)

    week += [Day() for i in xrange(7-len(week))]
    weeks.append(week)

    month.weeks = weeks
    user = get_current_user(request)

    return render_to_response('admin_calendar.html',locals())
Example #16
0
def user_balance(request):
    user = get_current_user(request)

    payments = RPPayments.objects.filter(status__in=[PS_OK,PS_WAIT], user=user).order_by('-transaction_end')

    return render_to_response('user_balance.html',locals())
Example #17
0
def manage_users(request):
    users = RPUser.objects.filter(role='user')
    user = get_current_user(request)

    return render_to_response('manage_users.html', locals())
Example #18
0
def admin_balance(request):
    user = get_current_user(request)

    balance = get_liqpay_balance()

    return render_to_response('admin_balance.html', locals())
Example #19
0
def admin_services(request):
    user = get_current_user(request)

    services = RPService.objects.filter(is_deleted=0)

    return render_to_response('admin_services.html', locals())
Example #20
0
def manage_service(request, service_id):
    user = get_current_user(request)

    if service_id:
        service_id = int(service_id)

    if request.method == 'POST':
        name = request.POST['name'].strip()
        name_ru = request.POST['name_ru'].strip()
        time_min = int(request.POST['time_min'])
        time_max = int(request.POST['time_max'])
        atom_money = int(request.POST['atom_money'])
        description = request.POST['description'].strip()
        description_ru = request.POST['description_ru'].strip()

        if not name:
            raise Exception('service name should be not empty')

        if atom_money <= 0:
            raise Exception('service atom_money should be greater then 0')

        if time_min > time_max:
            raise Exception('time_max should be greater or equal then time_min')

        if service_id:
            service = RPService.objects.get(id=int(service_id))
        else:
            service = RPService(name='', time_min=0, time_max=0, atom_money=0, description='', name_ru='', description_ru='')

        service.name = name
        service.time_min = time_min
        service.time_max = time_max
        service.atom_money = atom_money
        service.description = description
        service.name_ru = name_ru
        service.description_ru = description_ru

        service.save()

        return inform_message(_(u'Інформація про послугу успішно збережена!'), '/admin_services')


    if service_id:
        service = RPService.objects.get(id=service_id)
    else:
        service = RPService(name='', time_min=0, time_max=0, atom_money=0, description='', name_ru='', description_ru='')

    ##################################
    #TODO: rewrite this f*****g code to javascript
    class Time:
        def __init__(self, num, descr):
            self.num = num
            self.descr = descr

    time_min_list = [Time(30, _(u'30 хвилин')), Time(45, _(u'45 хвилин')), Time(60, _(u'1 година'))]
    tmp = []
    for time in time_min_list:
        if service.time_min == time.num:
            tmp.insert(0, time)
        else:
            tmp.append(time)
    service.time_min = tmp

    time_max_list = [Time(30, _(u'30 хвилин')), Time(45, _(u'45 хвилин')), Time(60, _(u'1 година')), Time(75, _(u'1 година 15 хвилин')), Time(90, _(u'1 година 30 хвилин')), Time(105, _(u'1 година 45 хвилин')), Time(120, _(u'2 години'))]
    tmp = []
    for time in time_max_list:
        if service.time_max == time.num:
            tmp.insert(0, time)
        else:
            tmp.append(time)
    service.time_max = tmp
    ##################################

    return render_to_response('manage_service.html', locals())
Example #21
0
def manage_record(request, record_id):
    user = get_current_user(request)
    record = RPRecord.objects.get(id=record_id)

    return render_to_response('manage_record.html', locals())