Skip to content

Commit 44ae7ba

Browse files
authored
Merge pull request #10 from moshthepitt/buggz
Fix bugz
2 parents 1292ca2 + 69b36ce commit 44ae7ba

File tree

5 files changed

+79
-51
lines changed

5 files changed

+79
-51
lines changed

Pipfile.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name='small-small-hr',
8-
version='0.0.5',
8+
version=__import__('small_small_hr').__version__,
99
description='Minimal human resource management app for Django',
1010
license='MIT',
1111
author='Kelvin Jayanoris',
@@ -18,6 +18,7 @@
1818
'psycopg2-binary',
1919
'sorl-thumbnail',
2020
'django-private-storage',
21+
'phonenumberslite',
2122
'django-phonenumber-field',
2223
'django-crispy-forms',
2324
'djangorestframework'

small_small_hr/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""
2+
Main init file for small_small_hr
3+
"""
4+
VERSION = (0, 0, 6)
5+
__version__ = '.'.join(str(v) for v in VERSION)

small_small_hr/forms.py

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
from crispy_forms.bootstrap import Field, FormActions
1414
from crispy_forms.helper import FormHelper
1515
from crispy_forms.layout import Layout, Submit
16+
from phonenumber_field.phonenumber import PhoneNumber
1617
from phonenumber_field.formfields import PhoneNumberField
1718

1819
from small_small_hr.models import (TWOPLACES, Leave, OverTime, Role,
1920
StaffDocument, StaffProfile, AnnualLeave)
2021

2122

23+
DEFAULT_TIME = getattr(settings, 'SSHR_DEFAULT_TIME', 7)
24+
25+
2226
class AnnualLeaveForm(forms.ModelForm):
2327
"""
2428
Form used when managing AnnualLeave
@@ -259,7 +263,7 @@ def clean_start(self):
259263
data = self.cleaned_data['start']
260264
data = datetime.combine(
261265
date=data,
262-
time=time(0, 0, 0, 0),
266+
time=time(DEFAULT_TIME, 0, 0, 0),
263267
tzinfo=pytz.timezone(settings.TIME_ZONE))
264268
return data
265269

@@ -270,7 +274,7 @@ def clean_end(self):
270274
data = self.cleaned_data['end']
271275
data = datetime.combine(
272276
date=data,
273-
time=time(0, 0, 0, 0),
277+
time=time(DEFAULT_TIME, 0, 0, 0),
274278
tzinfo=pytz.timezone(settings.TIME_ZONE))
275279
return data
276280

@@ -284,48 +288,51 @@ def clean(self):
284288
end = cleaned_data.get('end')
285289
start = cleaned_data.get('start')
286290

287-
# end year and start year must be the same
288-
if end.year != start.year:
289-
msg = _('start and end must be from the same year')
290-
self.add_error('start', msg)
291-
self.add_error('end', msg)
292-
293-
# end must be later than start
294-
if end <= start:
295-
self.add_error('end', _("end must be greater than start"))
296-
297-
# staff profile must have sufficient sick days
298-
if leave_type == Leave.SICK:
299-
sick_days = staff.get_available_sick_days(year=start.year)
300-
if (end - start).days > sick_days:
301-
msg = _('Not enough sick days. Available sick days '
302-
f'are {sick_days.quantize(TWOPLACES)}')
291+
if all([staff, leave_type, start, end]):
292+
# end year and start year must be the same
293+
if end.year != start.year:
294+
msg = _('start and end must be from the same year')
303295
self.add_error('start', msg)
304296
self.add_error('end', msg)
305297

306-
# staff profile must have sufficient leave days
307-
if leave_type == Leave.REGULAR:
308-
leave_days = staff.get_available_leave_days(year=start.year)
309-
if (end - start).days > leave_days:
310-
msg = _('Not enough leave days. Available leave days '
311-
f'are {leave_days.quantize(TWOPLACES)}')
298+
# end must be later than start
299+
if end <= start:
300+
self.add_error('end', _("end must be greater than start"))
301+
302+
# staff profile must have sufficient sick days
303+
if leave_type == Leave.SICK:
304+
sick_days = staff.get_available_sick_days(year=start.year)
305+
if (end - start).days > sick_days:
306+
msg = _('Not enough sick days. Available sick days '
307+
f'are {sick_days.quantize(TWOPLACES)}')
308+
self.add_error('start', msg)
309+
self.add_error('end', msg)
310+
311+
# staff profile must have sufficient leave days
312+
if leave_type == Leave.REGULAR:
313+
leave_days = staff.get_available_leave_days(year=start.year)
314+
if (end - start).days > leave_days:
315+
msg = _('Not enough leave days. Available leave days '
316+
f'are {leave_days.quantize(TWOPLACES)}')
317+
self.add_error('start', msg)
318+
self.add_error('end', msg)
319+
320+
# must not overlap
321+
# pylint: disable=no-member
322+
overlap_qs = Leave.objects.filter(
323+
staff=staff,
324+
status=Leave.APPROVED,
325+
leave_type=leave_type).filter(
326+
Q(start__gte=start) | Q(end__lte=end))
327+
328+
if self.instance is not None:
329+
overlap_qs = overlap_qs.exclude(id=self.instance.id)
330+
331+
if overlap_qs.exists():
332+
msg = _('you cannot have overlapping leave days')
312333
self.add_error('start', msg)
313334
self.add_error('end', msg)
314335

315-
# must not overlap
316-
# pylint: disable=no-member
317-
overlap_qs = Leave.objects.filter(
318-
staff=staff, status=Leave.APPROVED, leave_type=leave_type).filter(
319-
Q(start__gte=start) | Q(end__lte=end))
320-
321-
if self.instance is not None:
322-
overlap_qs = overlap_qs.exclude(id=self.instance.id)
323-
324-
if overlap_qs.exists():
325-
msg = _('you cannot have overlapping leave days')
326-
self.add_error('start', msg)
327-
self.add_error('end', msg)
328-
329336

330337
class ApplyLeaveForm(LeaveForm):
331338
"""
@@ -539,6 +546,8 @@ def save(self, commit=True): # pylint: disable=unused-argument
539546
staffprofile = super().save()
540547

541548
emergency_phone = self.cleaned_data.get('emergency_contact_number')
549+
if isinstance(emergency_phone, PhoneNumber):
550+
emergency_phone = emergency_phone.as_e164
542551

543552
json_data = {
544553
'id_number': self.cleaned_data.get('id_number'),

tests/test_forms.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ def test_overtime_form_start_end(self):
256256
form.errors['end'][0]
257257
)
258258

259+
@override_settings(SSHR_DEFAULT_TIME=7)
259260
def test_leaveform_apply(self):
260261
"""
261262
Test LeaveForm apply for leave
@@ -272,9 +273,9 @@ def test_leaveform_apply(self):
272273

273274
# 6 days of leave
274275
start = datetime(
275-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
276+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
276277
end = datetime(
277-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
278+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
278279

279280
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
280281
leave_type=Leave.REGULAR, carried_over_days=12)
@@ -300,6 +301,7 @@ def test_leaveform_apply(self):
300301
self.assertEqual(Leave.PENDING, leave.status)
301302
self.assertEqual('', leave.comments)
302303

304+
@override_settings(SSHR_DEFAULT_TIME=7)
303305
def test_leaveform_no_overlap(self):
304306
"""
305307
Test LeaveForm no overlap
@@ -316,9 +318,9 @@ def test_leaveform_no_overlap(self):
316318

317319
# 6 days of leave
318320
start = datetime(
319-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
321+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
320322
end = datetime(
321-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
323+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
322324

323325
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
324326
leave_type=Leave.REGULAR, carried_over_days=12)
@@ -347,6 +349,7 @@ def test_leaveform_no_overlap(self):
347349
form.errors['end'][0]
348350
)
349351

352+
@override_settings(SSHR_DEFAULT_TIME=7)
350353
def test_leaveform_admin(self):
351354
"""
352355
Test LeaveForm apply for leave
@@ -363,9 +366,9 @@ def test_leaveform_admin(self):
363366

364367
# 6 days of leave
365368
start = datetime(
366-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
369+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
367370
end = datetime(
368-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
371+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
369372

370373
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
371374
leave_type=Leave.REGULAR, carried_over_days=12)
@@ -393,6 +396,7 @@ def test_leaveform_admin(self):
393396
self.assertEqual(Leave.APPROVED, leave.status)
394397
self.assertEqual('Okay', leave.comments)
395398

399+
@override_settings(SSHR_DEFAULT_TIME=7)
396400
def test_leaveform_process(self):
397401
"""
398402
Test LeaveForm process
@@ -409,9 +413,9 @@ def test_leaveform_process(self):
409413

410414
# 6 days of leave
411415
start = datetime(
412-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
416+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
413417
end = datetime(
414-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
418+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
415419

416420
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
417421
leave_type=Leave.REGULAR, carried_over_days=4)
@@ -439,6 +443,7 @@ def test_leaveform_process(self):
439443
self.assertEqual(Leave.REJECTED, leave.status)
440444
self.assertEqual('Just no', leave.comments)
441445

446+
@override_settings(SSHR_DEFAULT_TIME=7)
442447
def test_sickleave_apply(self):
443448
"""
444449
Test LeaveForm apply for sick leave
@@ -455,9 +460,9 @@ def test_sickleave_apply(self):
455460

456461
# 6 days of leave
457462
start = datetime(
458-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
463+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
459464
end = datetime(
460-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
465+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
461466

462467
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
463468
leave_type=Leave.SICK, carried_over_days=4)
@@ -483,6 +488,7 @@ def test_sickleave_apply(self):
483488
self.assertEqual(Leave.PENDING, leave.status)
484489
self.assertEqual('', leave.comments)
485490

491+
@override_settings(SSHR_DEFAULT_TIME=7)
486492
def test_sickleave_process(self):
487493
"""
488494
Test LeaveForm process sick leave
@@ -499,9 +505,9 @@ def test_sickleave_process(self):
499505

500506
# 6 days of leave
501507
start = datetime(
502-
2017, 6, 5, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
508+
2017, 6, 5, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
503509
end = datetime(
504-
2017, 6, 10, 0, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
510+
2017, 6, 10, 7, 0, 0, tzinfo=pytz.timezone(settings.TIME_ZONE))
505511

506512
mommy.make('small_small_hr.AnnualLeave', staff=staffprofile, year=2017,
507513
leave_type=Leave.SICK, carried_over_days=4)

0 commit comments

Comments
 (0)