Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Maják
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
hemp
Maják
Commits
c33c7e58
Commit
c33c7e58
authored
4 years ago
by
jan.bednarik
Browse files
Options
Downloads
Patches
Plain Diff
calendar utils: CalendarMixin model
parent
948263b1
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
calendar_utils/models.py
+33
-0
33 additions, 0 deletions
calendar_utils/models.py
tests/calendar_utils/conftest.py
+19
-0
19 additions, 0 deletions
tests/calendar_utils/conftest.py
tests/calendar_utils/test_models.py
+61
-0
61 additions, 0 deletions
tests/calendar_utils/test_models.py
with
113 additions
and
0 deletions
calendar_utils/models.py
+
33
−
0
View file @
c33c7e58
...
...
@@ -43,3 +43,36 @@ class Calendar(models.Model):
self
.
future_events
=
list
(
map
(
_convert_arrow_to_datetime
,
future
))
self
.
last_update
=
arrow
.
utcnow
().
datetime
self
.
save
()
class
CalendarMixin
(
models
.
Model
):
"""
Mixin to be used in other models, like site settings, which adds relation
to Calendar.
"""
calendar_url
=
models
.
URLField
(
"
URL kalendáře ve formátu iCal
"
,
blank
=
True
,
null
=
True
)
calendar
=
models
.
ForeignKey
(
Calendar
,
null
=
True
,
on_delete
=
models
.
PROTECT
)
class
Meta
:
abstract
=
True
def
save
(
self
,
*
args
,
**
kwargs
):
# create or update related Calendar
if
self
.
calendar_url
:
if
self
.
calendar
:
if
self
.
calendar
.
url
!=
self
.
calendar_url
:
self
.
calendar
.
url
=
self
.
calendar_url
self
.
calendar
.
save
()
else
:
self
.
calendar
=
Calendar
.
objects
.
create
(
url
=
self
.
calendar_url
)
self
.
calendar
.
update_source
()
# delete related Calendar when URL is cleared
if
not
self
.
calendar_url
and
self
.
calendar
:
self
.
calendar
.
delete
()
self
.
calendar
=
None
super
().
save
(
*
args
,
**
kwargs
)
This diff is collapsed.
Click to expand it.
tests/calendar_utils/conftest.py
+
19
−
0
View file @
c33c7e58
from
pathlib
import
Path
import
pytest
from
django.db
import
connection
from
calendar_utils.models
import
CalendarMixin
@pytest.fixture
(
scope
=
"
session
"
)
def
sample
():
return
(
Path
(
__file__
).
parent
/
"
sample.ics
"
).
read_text
()
class
DummyModel
(
CalendarMixin
):
class
Meta
:
app_label
=
"
__tests
"
@pytest.fixture
(
scope
=
"
session
"
)
def
Dummy
(
django_db_setup
,
django_db_blocker
):
with
django_db_blocker
.
unblock
():
with
connection
.
schema_editor
()
as
editor
:
editor
.
create_model
(
DummyModel
)
yield
DummyModel
with
django_db_blocker
.
unblock
():
with
connection
.
schema_editor
()
as
editor
:
editor
.
delete_model
(
DummyModel
)
This diff is collapsed.
Click to expand it.
tests/calendar_utils/test_models.py
+
61
−
0
View file @
c33c7e58
...
...
@@ -79,3 +79,64 @@ def test_calendar__save_and_load_events__no_values():
cal
.
refresh_from_db
()
assert
cal
.
past_events
is
None
assert
cal
.
future_events
is
None
def
test_calendar_mixin__no_calendar_url
(
Dummy
):
obj
=
Dummy
.
objects
.
create
()
assert
obj
.
calendar
is
None
def
test_calendar_mixin__set_calendar_url
(
Dummy
,
mocker
):
m_update
=
mocker
.
patch
.
object
(
Calendar
,
"
update_source
"
)
url
=
fake
.
url
()
obj
=
Dummy
.
objects
.
create
(
calendar_url
=
url
)
obj
.
refresh_from_db
()
assert
obj
.
calendar_url
==
url
assert
obj
.
calendar
.
url
==
url
assert
m_update
.
call_count
==
1
def
test_calendar_mixin__update_calendar_url
(
Dummy
,
mocker
):
m_update
=
mocker
.
patch
.
object
(
Calendar
,
"
update_source
"
)
obj
=
Dummy
.
objects
.
create
(
calendar_url
=
fake
.
url
())
url
=
fake
.
url
()
m_update
.
reset_mock
()
obj
.
calendar_url
=
url
obj
.
save
()
obj
.
refresh_from_db
()
assert
obj
.
calendar_url
==
url
assert
obj
.
calendar
.
url
==
url
assert
m_update
.
call_count
==
1
def
test_calendar_mixin__unchanged_calendar_url
(
Dummy
,
mocker
):
m_update
=
mocker
.
patch
.
object
(
Calendar
,
"
update_source
"
)
url
=
fake
.
url
()
obj
=
Dummy
.
objects
.
create
(
calendar_url
=
url
)
m_update
.
reset_mock
()
obj
.
save
()
obj
.
refresh_from_db
()
assert
obj
.
calendar_url
==
url
assert
obj
.
calendar
.
url
==
url
assert
m_update
.
call_count
==
1
def
test_calendar_mixin__clear_calendar_url
(
Dummy
,
mocker
):
m_update
=
mocker
.
patch
.
object
(
Calendar
,
"
update_source
"
)
obj
=
Dummy
.
objects
.
create
(
calendar_url
=
fake
.
url
())
m_update
.
reset_mock
()
obj
.
calendar_url
=
None
obj
.
save
()
obj
.
refresh_from_db
()
assert
obj
.
calendar_url
is
None
assert
obj
.
calendar
is
None
assert
m_update
.
call_count
==
0
assert
Calendar
.
objects
.
count
()
==
0
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment