Converted to an SPA
diff --git a/erpnext/www/book-appointment/1.html b/erpnext/www/book-appointment/1.html
deleted file mode 100644
index da4fb25..0000000
--- a/erpnext/www/book-appointment/1.html
+++ /dev/null
@@ -1,38 +0,0 @@
-{% extends "templates/web.html" %}
-
-{% block title %}{{ _("Book Appointment") }}{% endblock %}
-
-{% block page_content %}
-<div class="container">
- <!-- title: Book an appointment -->
- <div class="text-center mb-5">
- <h3>Book an appointment</h3>
- <h4>Select the date and your timezone</h4>
- </div>
- <div class="row justify-content-center mt-3">
- <div class="col-md-4 align-self-center ">
- <form name="myform">
- <input
- type="date"
- onchange="ondatechange()"
- name="appointment-date"
- id="appointment-date"
- class="form-control mt-3"
- min="{{ from_date }}"
- max="{{ to_date }}">
- <select name="appointment-timezone" id="appointment-timezone" class="form-control mt-3">
- {% if timezones %}
- {% for timezone in timezones%}
- <option value="{{timezone.offset}}">{{timezone.timezone_name}}</option>
- {% endfor %}
- {% endif %}
- </select>
- </form>
- <button class="form-control mt-3 btn btn-dark" id="next-button" onclick="next()">
- Next
- </button>
- </div>
- </div>
-</div>
-
-{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/1.js b/erpnext/www/book-appointment/1.js
deleted file mode 100644
index 9f6c487..0000000
--- a/erpnext/www/book-appointment/1.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-{% include 'erpnext/public/js/date_polyfill.js' %}
-let holidays = [];
-{% if holidays %}
- holidays = {{holidays}}
-{% endif %}
-
-function next() {
- let date = document.getElementsByName('appointment-date')[0].value;
- if(holidays.includes(date)){
- frappe.throw("That day is a holiday")
- }
- if(date === ""){
- frappe.throw("Please select a date")
- }
- let tz = document.getElementsByName('appointment-timezone')[0].value;
- window.location = `/book-appointment/2?date=${date}&tz=${tz}`;
-}
-
-function ondatechange(){
- let date = document.getElementById('appointment-date')
- if(holidays.includes(date.value)){
- frappe.throw("That day is a holiday")
- }
-}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/1.py b/erpnext/www/book-appointment/1.py
deleted file mode 100644
index 95169b9..0000000
--- a/erpnext/www/book-appointment/1.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import frappe
-
-def get_context(context):
- settings = frappe.get_doc('Appointment Booking Settings')
- holiday_list = frappe.get_doc('Holiday List',settings.holiday_list)
- holidays = []
- for holiday in holiday_list.holidays:
- print(str(holiday.holiday_date))
- holidays.append(str(holiday.holiday_date))
- context.holidays = holidays
- context.from_date = holiday_list.from_date
- context.to_date = holiday_list.to_date
- timezones = frappe.get_all('Timezone',fields=["timezone_name","offset"])
- context.timezones = timezones
-
- return context
-
diff --git a/erpnext/www/book-appointment/2.html b/erpnext/www/book-appointment/2.html
deleted file mode 100644
index 2a8c5c9..0000000
--- a/erpnext/www/book-appointment/2.html
+++ /dev/null
@@ -1,60 +0,0 @@
-{% extends "templates/web.html" %}
-
-{% block title %}{{ _("Book Appointment") }}{% endblock %}
-
-{% block page_content %}
-<style>
- .time-slot {
- margin: 0 0;
- border: 0.5px solid #cccccc;
- min-height: 100px;
- }
-
- .time-slot:hover {
- background: #ddd;
- }
-
- .time-slot.unavailable {
- background: #bbb;
-
- color: #777777
- }
-
- input[type="radio"] {
- visibility: hidden;
- display: none;
- }
-
- .time-slot.selected {
- color: white;
- background: #5e64ff;
- }
-</style>
-<div class="container">
- <div class="text-center mb-5">
- {% if is_holiday %}
- <h3> This day is a holiday</h3>
- {% else %}
- <h3>Pick A Time Slot</h3>
- <h4>Selected date is {{ date }}</h4>
- </div>
- <!-- Start of main content-->
-
- <div class="mt-3 justify-content-center">
- <div class="row">
- {% for timeslot in timeslots %}
- <div class="col-md time-slot {% if timeslot.unavailable %}unavailable{% endif %}" id="{{ timeslot.time.time() }}">{{ timeslot.time.time().strftime('%H : %M') }}</div>
- {% endfor %}
- </div>
- <div class="row justify-content-center">
- <div class="col-md-4 align-self-center">
- <button class="form-control mt-5 btn btn-dark" onclick="next()">
- Next
- </button>
- </div>
- </div>
- {% endif %}
- </div>
-</div>
-<!-- End of main content -->
-{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/2.js b/erpnext/www/book-appointment/2.js
deleted file mode 100644
index 113564a..0000000
--- a/erpnext/www/book-appointment/2.js
+++ /dev/null
@@ -1,31 +0,0 @@
-let time_slot_divs = document.getElementsByClassName('time-slot');
-
-function get_available_slots() {
- frappe.db
-}
-
-function select_time() {
- if (this.classList.contains("unavailable")) {
- return
- }
- console.log(this.id)
- try{
- selected_element = document.getElementsByClassName('selected')[0]
- }catch(e){
- this.classList.add('selected')
- }
- selected_element.classList.remove('selected');
- this.classList.add('selected');
-}
-
-for (var i = 0; i < time_slot_divs.length; i++) {
- time_slot_divs[i].addEventListener('click', select_time);
-}
-
-function next() {
- let urlParams = new URLSearchParams(window.location.search);
- let date = urlParams.get("date");
- let tz = urlParams.get("tz");
- let time_slot = document.querySelector(".selected").id;
- window.location.href = `/book-appointment/3?date=${date}&tz=${tz}&time=${time_slot}`;
-}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/2.py b/erpnext/www/book-appointment/2.py
deleted file mode 100644
index fa8aafa..0000000
--- a/erpnext/www/book-appointment/2.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import frappe
-import datetime
-
-
-def get_context(context):
- # Get query parameters
- date = frappe.form_dict['date']
- tz = frappe.form_dict['tz']
- tz = int(tz)
- # Database queries
- settings = frappe.get_doc('Appointment Booking Settings')
- holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
- # Format datetimes
- format_string = '%Y-%m-%d %H:%M:%S'
- start_time = datetime.datetime.strptime(date+' 00:00:00', format_string)
- end_time = datetime.datetime.strptime(date+' 23:59:59', format_string)
- # Convert to ist
- start_time = _convert_to_ist(start_time, tz)
- end_time = _convert_to_ist(end_time, tz)
- timeslots = get_available_slots_between(start_time, end_time, settings)
- converted_timeslots = []
- print('Appointments')
- print(frappe.get_list('Appointment',fields=['from_time']))
- for timeslot in timeslots:
- if timeslot > end_time or timeslot < start_time:
- pass
- else:
- if frappe.db.count('Appointment',{'from_time':start_time.time()}) < settings.number_of_agents:
- converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz), unavailable=False))
- else:
- converted_timeslots.append(dict(time=_convert_to_tz(timeslot, tz),unavailable=True))
-
- context.timeslots = converted_timeslots
- context.date = date
- return context
-
-def _is_holiday(date, holiday_list):
- for holiday in holiday_list.holidays:
- if holiday.holiday_date.isoformat() == date:
- return True
- return False
-
-def _convert_to_ist(datetime_object, timezone):
- offset = datetime.timedelta(minutes=timezone)
- datetime_object = datetime_object + offset
- offset = datetime.timedelta(minutes=-330)
- datetime_object = datetime_object - offset
- return datetime_object
-
-def _convert_to_tz(datetime_object, timezone):
- offset = datetime.timedelta(minutes=timezone)
- datetime_object = datetime_object - offset
- offset = datetime.timedelta(minutes=-330)
- datetime_object = datetime_object + offset
- return datetime_object
-
-def get_available_slots_between(start_time_parameter, end_time_parameter, settings):
- records = get_records(start_time_parameter, end_time_parameter, settings)
- timeslots = []
- appointment_duration = datetime.timedelta(
- minutes=settings.appointment_duration)
- for record in records:
- if record.day_of_week == weekdays[start_time_parameter.weekday()]:
- current_time = _deltatime_to_datetime(
- start_time_parameter, record.from_time)
- end_time = _deltatime_to_datetime(
- start_time_parameter, record.to_time)
- elif record.day_of_week == weekdays[end_time_parameter.weekday()]:
- current_time = _deltatime_to_datetime(
- end_time_parameter, record.from_time)
- end_time = _deltatime_to_datetime(
- end_time_parameter, record.to_time)
- while current_time + appointment_duration <= end_time:
- timeslots.append(current_time)
- current_time += appointment_duration
- return timeslots
-
-
-def get_records(start_time, end_time, settings):
- records = []
- for record in settings.availability_of_slots:
- if record.day_of_week == weekdays[start_time.weekday()] or record.day_of_week == weekdays[end_time.weekday()]:
- records.append(record)
- return records
-
-
-def _deltatime_to_datetime(date, deltatime):
- time = (datetime.datetime.min + deltatime).time()
- return datetime.datetime.combine(date.date(), time)
-
-
-weekdays = ["Monday", "Tuesday", "Wednesday",
- "Thursday", "Friday", "Saturday", "Sunday"]
diff --git a/erpnext/www/book-appointment/3.html b/erpnext/www/book-appointment/3.html
deleted file mode 100644
index b627a0c..0000000
--- a/erpnext/www/book-appointment/3.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "templates/web.html" %}
-
-{% block title %}{{ _("Book Appointment") }}{% endblock %}
-
-{% block page_content %}
-<div class="container">
-
- <div class="text-center mb-5">
- <h3>Add details</h3>
- <h4>Selected date is {{ date }} at {{ time }}</h4>
- </div>
- <div class="row justify-content-center mt-3">
- <div class="col-md-4 align-items-center">
- <input class="form-control mt-3" type="text" name="customer_name" id="customer_name" placeholder="Your Name" required>
- <input class="form-control mt-3" type="tel" name="customer_number" id="customer_number" placeholder="Contact Number" required>
- <input class="form-control mt-3" type="text" name="customer_skype" id="customer_skype" placeholder="Skype" required>
- <textarea class="form-control mt-3" name="customer_notes" id="customer_notes" cols="30" rows="10" placeholder="Notes"></textarea>
- <button class="btn btn-primary form-control mt-3" onclick="submit()">Submit</button>
- </div>
- </div>
-</div>
-{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/3.js b/erpnext/www/book-appointment/3.js
deleted file mode 100644
index 23c55a3..0000000
--- a/erpnext/www/book-appointment/3.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function submit(){
- let params = new URLSearchParams(window.location.search);
- const date = params.get('date');
- const time = params.get('time');
- const tz = params.get('tz');
- const customer_name = document.getElementById('customer_name').value;
- const customer_number = document.getElementById('customer_number').value;
- const customer_skype = document.getElementById('customer_skype').value;
- const customer_notes = document.getElementById('customer_notes').value;
- console.log({date,time,tz,customer_name,customer_number,customer_skype,customer_notes});
-}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.css b/erpnext/www/book-appointment/index.css
new file mode 100644
index 0000000..3ffe996
--- /dev/null
+++ b/erpnext/www/book-appointment/index.css
@@ -0,0 +1,25 @@
+.time-slot {
+ margin: 0 0;
+ border: 0.5px solid #cccccc;
+ min-height: 100px;
+}
+
+.time-slot:hover {
+ background: #ddd;
+}
+
+.time-slot.unavailable {
+ background: #bbb;
+
+ color: #777777
+}
+
+input[type="radio"] {
+ visibility: hidden;
+ display: none;
+}
+
+.time-slot.selected {
+ color: white;
+ background: #5e64ff;
+}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.html b/erpnext/www/book-appointment/index.html
new file mode 100644
index 0000000..b705f9e
--- /dev/null
+++ b/erpnext/www/book-appointment/index.html
@@ -0,0 +1,70 @@
+{% extends "templates/web.html" %}
+
+{% block title %}{{ _("Book Appointment") }}{% endblock %}
+
+{% block page_content %}
+<div class="container">
+ <!-- title: Book an appointment -->
+ <div id="select-date">
+ <div class="text-center mb-5">
+ <h3>Book an appointment</h3>
+ <p class="lead">Select the date and your timezone</p>
+ </div>
+ <div class="row justify-content-center mt-3">
+ <div class="col-md-4 align-self-center ">
+ <form name="myform">
+ <input type="date" onchange="validate_date()" name="appointment-date" id="appointment-date"
+ class="form-control mt-3">
+ <select name="appointment-timezone" id="appointment-timezone" class="form-control mt-3">
+ </select>
+ </form>
+ <button class="form-control mt-3 btn btn-dark" id="next-button" onclick="navigate_to_time_select()">
+ Next
+ </button>
+ </div>
+ </div>
+ </div>
+
+ <!--Select Time Slot-->
+ <div id="select-time">
+ <div class="text-center mb-5">
+ <h3>Pick A Time Slot</h3>
+ <p class="lead">Selected date is <span class="date-span">Date Span</span></p>
+ </div>
+ <div class="mt-3 justify-content-center">
+ <div class="row" id="timeslot-container">
+
+ </div>
+ <div class="row justify-content-center">
+ <div class="col-md-4 align-self-center">
+ <button class="form-control mt-5 btn btn-dark" onclick="initialise_enter_details()">
+ Next
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!--Enter Details-->
+ <div id="enter-details">
+ <div class="text-center mb-5">
+ <h3>Add details</h3>
+ <p class="lead">Selected date is <span class="date-span">Date Span</span> at <span class="time-span"> time </span></p>
+ </div>
+ <div class="row justify-content-center mt-3">
+ <div class="col-md-4 align-items-center">
+ <input class="form-control mt-3" type="text" name="customer_name" id="customer_name" placeholder="Your Name"
+ required>
+ <input class="form-control mt-3" type="tel" name="customer_number" id="customer_number"
+ placeholder="Contact Number" required>
+ <input class="form-control mt-3" type="text" name="customer_skype" id="customer_skype" placeholder="Skype"
+ required>
+ <textarea class="form-control mt-3" name="customer_notes" id="customer_notes" cols="30" rows="10"
+ placeholder="Notes"></textarea>
+ <button class="btn btn-primary form-control mt-3" onclick="submit()">Submit</button>
+ </div>
+ </div>
+ </div>
+</div>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/book-appointment/index.js b/erpnext/www/book-appointment/index.js
new file mode 100644
index 0000000..1482c51
--- /dev/null
+++ b/erpnext/www/book-appointment/index.js
@@ -0,0 +1,146 @@
+
+frappe.ready(() => {
+ initialise_select_date()
+})
+var holiday_list = [];
+
+function navigator(page_no) {
+ let select_date_div = document.getElementById('select-date');
+ select_date_div.style.display = 'none';
+ let select_time_div = document.getElementById('select-time');
+ select_time_div.style.display = 'none';
+ let contact_details_div = document.getElementById('enter-details');
+ contact_details_div.style.display = 'none';
+ let page;
+ switch (page_no) {
+ case 1: page = select_date_div; break;
+ case 2: page = select_time_div; break;
+ case 3: page = contact_details_div; break;
+ }
+ page.style.display = 'block'
+}
+
+// Page 1
+async function initialise_select_date() {
+ navigator(1);
+ let timezones, settings;
+ settings = (await frappe.call({
+ method: 'erpnext.www.book-appointment.index.get_appointment_settings'
+ })).message
+ timezones = (await frappe.call({
+ method: 'erpnext.www.book-appointment.index.get_timezones'
+ })).message;
+ holiday_list = (await frappe.call({
+ method: 'erpnext.www.book-appointment.index.get_holiday_list',
+ args: {
+ 'holiday_list_name': settings.holiday_list
+ }
+ })).message;
+ let date_picker = document.getElementById('appointment-date');
+ date_picker.max = holiday_list.to_date;
+ date_picker.min = holiday_list.from_date;
+ date_picker.value = (new Date()).toISOString().substr(0, 10);
+ let timezones_element = document.getElementById('appointment-timezone');
+ var offset = new Date().getTimezoneOffset();
+ timezones.forEach(timezone => {
+ var opt = document.createElement('option');
+ opt.value = timezone.offset;
+ opt.innerHTML = timezone.timezone_name;
+ opt.defaultSelected = (offset == timezone.offset)
+ timezones_element.appendChild(opt)
+ });
+}
+
+function validate_date() {
+ let date_picker = document.getElementById('appointment-date');
+ if (date_picker.value === '') {
+ frappe.throw('Please select a date')
+ }
+}
+
+// Page 2
+async function navigate_to_time_select() {
+ navigator(2);
+ timezone = document.getElementById('appointment-timezone').value
+ date = document.getElementById('appointment-date').value;
+ var date_spans = document.getElementsByClassName('date-span');
+ for (var i = 0; i < date_spans.length; i++) date_spans[i].innerHTML = date;
+ // date_span.addEventListener('click',initialise_select_date)
+ // date_span.style.color = '#5e64ff';
+ // date_span.style.textDecoration = 'underline';
+ // date_span.style.cursor = 'pointer';
+ var slots = (await frappe.call({
+ method: 'erpnext.www.book-appointment.index.get_appointment_slots',
+ args: {
+ date: date,
+ timezone: timezone
+ }
+ })).message;
+ let timeslot_container = document.getElementById('timeslot-container');
+ console.log(slots)
+ if (slots.length <= 0) {
+ let message_div = document.createElement('p');
+
+ message_div.innerHTML = "There are no slots available on this date";
+ timeslot_container.appendChild(message_div);
+ }
+ for (let i = 0; i < slots.length; i++) {
+ const slot = slots[i];
+ var timeslot_div = document.createElement('div');
+ timeslot_div.classList.add('time-slot');
+ timeslot_div.classList.add('col-md');
+ if (!slot.availability) {
+ timeslot_div.classList.add('unavailable')
+ }
+ timeslot_div.innerHTML = slot.time.substr(11, 20);
+ timeslot_div.id = slot.time.substr(11, 20);
+ timeslot_container.appendChild(timeslot_div);
+ }
+ set_default_timeslot()
+ let time_slot_divs = document.getElementsByClassName('time-slot');
+ for (var i = 0; i < time_slot_divs.length; i++) {
+ time_slot_divs[i].addEventListener('click', select_time);
+ }
+}
+
+function select_time() {
+ if (this.classList.contains("unavailable")) {
+ return
+ }
+ try {
+ selected_element = document.getElementsByClassName('selected')[0]
+ } catch (e) {
+ this.classList.add("selected")
+ }
+ selected_element.classList.remove("selected");
+ this.classList.add("selected");
+}
+
+function set_default_timeslot() {
+ let timeslots = document.getElementsByClassName('time-slot')
+ for (let i = 0; i < timeslots.length; i++) {
+ const timeslot = timeslots[i];
+ if (!timeslot.classList.contains('unavailable')) {
+ timeslot.classList.add("selected");
+ break;
+ }
+ }
+}
+
+function initialise_enter_details() {
+ navigator(3);
+ let time_div = document.getElementsByClassName('selected')[0];
+ let time_span = document.getElementsByClassName('time-span')[0];
+ time_span.innerHTML = time_div.id
+}
+
+function submit() {
+ var date = document.getElementById('appointment-date').value;
+ var time = document.getElementsByClassName('selected')[0].id;
+ contact = {};
+ contact.name = document.getElementById('customer_name').value;
+ contact.number = document.getElementById('customer_number').value;
+ contact.skype = document.getElementById('customer_skype').value;
+ contact.notes = document.getElementById('customer_notes').value;
+ console.log({ date, time, contact });
+}
diff --git a/erpnext/www/book-appointment/index.py b/erpnext/www/book-appointment/index.py
new file mode 100644
index 0000000..15d5f9a
--- /dev/null
+++ b/erpnext/www/book-appointment/index.py
@@ -0,0 +1,123 @@
+import frappe
+import datetime
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_settings():
+ settings = frappe.get_doc('Appointment Booking Settings')
+ return settings
+
+@frappe.whitelist(allow_guest=True)
+def get_holiday_list(holiday_list_name):
+ holiday_list = frappe.get_doc('Holiday List',holiday_list_name)
+ return holiday_list
+
+@frappe.whitelist(allow_guest=True)
+def get_timezones():
+ timezones = frappe.get_list('Timezone',fields='*')
+ return timezones
+
+@frappe.whitelist(allow_guest=True)
+def get_appointment_slots(date,timezone):
+ timezone = int(timezone)
+ format_string = '%Y-%m-%d %H:%M:%S'
+ query_start_time = datetime.datetime.strptime(date + ' 00:00:00',format_string)
+ query_end_time = datetime.datetime.strptime(date + ' 23:59:59',format_string)
+ query_start_time = _convert_to_ist(query_start_time,timezone)
+ query_end_time = _convert_to_ist(query_end_time,timezone)
+ # Database queries
+ settings = frappe.get_doc('Appointment Booking Settings')
+ holiday_list = frappe.get_doc('Holiday List', settings.holiday_list)
+ timeslots = get_available_slots_between(query_start_time, query_end_time, settings)
+
+ # Filter timeslots based on date
+ converted_timeslots = []
+ for timeslot in timeslots:
+ # Check if holiday
+ if _is_holiday(timeslot.date(),holiday_list):
+ converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
+ continue
+ # Check availability
+ if check_availabilty(timeslot,settings):
+ converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=True))
+ else:
+ converted_timeslots.append(dict(time=_convert_to_tz(timeslot,timezone),availability=False))
+ date_required = datetime.datetime.strptime(date + ' 00:00:00',format_string).date()
+ converted_timeslots = filter_timeslots(date_required,converted_timeslots)
+ return converted_timeslots
+
+def get_available_slots_between(query_start_time, query_end_time, settings):
+ records = _get_records(query_start_time, query_end_time, settings)
+ timeslots = []
+ appointment_duration = datetime.timedelta(
+ minutes=settings.appointment_duration)
+ for record in records:
+ if record.day_of_week == WEEKDAYS[query_start_time.weekday()]:
+ current_time = _deltatime_to_datetime(
+ query_start_time, record.from_time)
+ end_time = _deltatime_to_datetime(
+ query_start_time, record.to_time)
+ else :
+ current_time = _deltatime_to_datetime(
+ query_end_time, record.from_time)
+ end_time = _deltatime_to_datetime(
+ query_end_time, record.to_time)
+ while current_time + appointment_duration <= end_time:
+ timeslots.append(current_time)
+ current_time += appointment_duration
+ return timeslots
+
+@frappe.whitelist(allow_guest=True)
+def create_appointment(date,time,contact):
+
+ appointment = frappe.frappe.get_doc('Appointment')
+ appointment.scheduled_time = date
+
+def filter_timeslots(date,timeslots):
+ filtered_timeslots = []
+ for timeslot in timeslots:
+ if(timeslot['time'].date() == date):
+ filtered_timeslots.append(timeslot)
+ return filtered_timeslots
+
+def check_availabilty(timeslot,settings):
+ return frappe.db.count('Appointment',{'scheduled_time':timeslot})<settings.number_of_agents
+
+
+
+def _is_holiday(date, holiday_list):
+ for holiday in holiday_list.holidays:
+ if holiday.holiday_date == date:
+ return True
+ return False
+
+def _get_records(start_time, end_time, settings):
+ records = []
+ for record in settings.availability_of_slots:
+ if record.day_of_week == WEEKDAYS[start_time.weekday()] or record.day_of_week == WEEKDAYS[end_time.weekday()]:
+ records.append(record)
+ return records
+
+def _deltatime_to_datetime(date, deltatime):
+ time = (datetime.datetime.min + deltatime).time()
+ return datetime.datetime.combine(date.date(), time)
+
+def _datetime_to_deltatime(date_time):
+ midnight = datetime.datetime.combine(date_time.date(),datetime.time.min)
+ return (date_time-midnight)
+
+def _convert_to_ist(datetime_object, timezone):
+ offset = datetime.timedelta(minutes=timezone)
+ datetime_object = datetime_object + offset
+ offset = datetime.timedelta(minutes=-330)
+ datetime_object = datetime_object - offset
+ return datetime_object
+
+def _convert_to_tz(datetime_object, timezone):
+ offset = datetime.timedelta(minutes=timezone)
+ datetime_object = datetime_object - offset
+ offset = datetime.timedelta(minutes=-330)
+ datetime_object = datetime_object + offset
+ return datetime_object
+
+WEEKDAYS = ["Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday", "Sunday"]
\ No newline at end of file