Skip to content

Commit 86949f3

Browse files
committed
Drop event listener and unused code
1 parent f7c26a6 commit 86949f3

File tree

13 files changed

+315
-176
lines changed

13 files changed

+315
-176
lines changed

geokrety_api_models/geokret.py

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from datetime import datetime
55

66
from sqlalchemy import (TIMESTAMP, Boolean, Column, DateTime, Enum, ForeignKey,
7-
Integer, String, Text, event, inspect)
7+
Integer, String, Text, event)
88
from sqlalchemy.ext.hybrid import hybrid_property
99
from sqlalchemy.orm import relationship
1010
from sqlalchemy.orm.exc import NoResultFound
@@ -81,7 +81,7 @@ class Geokret(Base):
8181
nullable=False,
8282
default=0,
8383
)
84-
_created_on_datetime = Column(
84+
created_on_datetime = Column(
8585
'data',
8686
DateTime,
8787
nullable=False,
@@ -211,22 +211,6 @@ def description(self, description):
211211
def description(cls):
212212
return cls._description
213213

214-
@hybrid_property
215-
def created_on_datetime(self):
216-
if self._created_on_datetime is None:
217-
raise AssertionError("created_on_datetime is missing")
218-
if isinstance(self._created_on_datetime, str):
219-
self._created_on_datetime = datetime.strptime(self._created_on_datetime, "%Y-%m-%dT%H:%M:%S")
220-
return round_microseconds(self._created_on_datetime)
221-
222-
@created_on_datetime.setter
223-
def created_on_datetime(self, created_on_datetime):
224-
self._created_on_datetime = created_on_datetime
225-
226-
@created_on_datetime.expression
227-
def created_on_datetime(cls):
228-
return cls._created_on_datetime
229-
230214

231215
@event.listens_for(Geokret, 'init')
232216
def receive_init(target, args, kwargs):
@@ -235,36 +219,11 @@ def receive_init(target, args, kwargs):
235219

236220
@event.listens_for(Geokret, 'before_insert')
237221
def before_insert_listener(mapper, connection, target):
238-
if not target._created_on_datetime:
239-
target._created_on_datetime = round_microseconds(datetime.utcnow())
240-
target.updated_on_datetime = target._created_on_datetime
222+
if not target.created_on_datetime:
223+
target.created_on_datetime = round_microseconds(datetime.utcnow())
224+
target.updated_on_datetime = target.created_on_datetime
241225

242226

243227
@event.listens_for(Geokret, 'before_update')
244228
def before_update_listener(mapper, connection, target):
245229
target.updated_on_datetime = round_microseconds(datetime.utcnow())
246-
247-
248-
MONITORED_ATTRIBUTES = [
249-
'tracking_code',
250-
'_name',
251-
'_description',
252-
'type',
253-
'missing',
254-
'distance',
255-
'caches_count',
256-
'pictures_count',
257-
'updated_on_datetime',
258-
'owner_id',
259-
'holder_id',
260-
'last_position_id',
261-
'last_move_id',
262-
]
263-
264-
265-
def _has_changes_that_need_event(instance):
266-
instance_attrs = inspect(instance).attrs
267-
for attribute in MONITORED_ATTRIBUTES:
268-
if hasattr(instance_attrs, attribute) and \
269-
getattr(instance_attrs, attribute).history.has_changes():
270-
return True

geokrety_api_models/move.py

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
# -*- coding: utf-8 -*-
22

3-
from datetime import datetime, timedelta
3+
from datetime import datetime
44

5-
from sqlalchemy import (Column, DateTime, Enum, ForeignKey, Integer, String,
6-
event, func, inspect, select)
5+
from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String
76
from sqlalchemy.dialects.mysql import DOUBLE
87
from sqlalchemy.ext.hybrid import hybrid_property
98
from sqlalchemy.orm import backref, relationship
109

1110
import bleach
1211
import characterentities
13-
from geokrety_api_exceptions.json_api import GKUnprocessableEntity
1412

1513
from .base import Base
1614
from .utilities.date import round_microseconds
@@ -233,46 +231,6 @@ def application_name(cls):
233231

234232
@hybrid_property
235233
def _moved_on_datetime(self):
236-
if self.moved_on_datetime is None:
237-
raise AssertionError("moved_on_datetime is missing")
238234
if isinstance(self.moved_on_datetime, str):
239235
self.moved_on_datetime = datetime.strptime(self.moved_on_datetime, "%Y-%m-%dT%H:%M:%S")
240236
return round_microseconds(self.moved_on_datetime)
241-
242-
243-
@event.listens_for(Move, 'before_update')
244-
@event.listens_for(Move, 'before_insert')
245-
def my_before_insert_listener(mapper, connection, target):
246-
if target.geokret is None:
247-
raise GKUnprocessableEntity("Move must concern a GeoKret",
248-
{'pointer': '/data/relationships/geokret'})
249-
250-
# Move cannot be done before GeoKret birth
251-
if target._moved_on_datetime < target.geokret.created_on_datetime:
252-
raise GKUnprocessableEntity("Move date cannot be prior GeoKret birth date",
253-
{'pointer': '/data/attributes/moved-on-datetime'})
254-
255-
# Move cannot be done in the future
256-
if target._moved_on_datetime > datetime.utcnow().replace(microsecond=0) + timedelta(seconds=1):
257-
raise GKUnprocessableEntity("Move date cannot be in the future",
258-
{'pointer': '/data/attributes/moved-on-datetime'})
259-
260-
# Identical move date is forbidden
261-
if _has_changes_that_need_recompute(target):
262-
move_table = Move.__table__
263-
res = connection.execute(
264-
select([func.count()]).select_from(move_table).
265-
where(Move.moved_on_datetime == target.moved_on_datetime).
266-
where(Move.geokret_id == target.geokret.id).
267-
where(Move.id != target.id)
268-
).scalar()
269-
if res > 0:
270-
raise GKUnprocessableEntity("There is already a move at that time",
271-
{'pointer': '/data/attributes/moved-on-datetime'})
272-
273-
274-
def _has_changes_that_need_recompute(instance):
275-
if inspect(instance).attrs.type.history.has_changes() or \
276-
inspect(instance).attrs.moved_on_datetime.history.has_changes() or \
277-
inspect(instance).attrs.geokret.history.has_changes():
278-
return True

geokrety_api_models/move_comment.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import datetime
44

5-
from sqlalchemy import (Column, DateTime, ForeignKey, Integer, String, event,
6-
inspect)
5+
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, event
76
from sqlalchemy.ext.hybrid import hybrid_property
87
from sqlalchemy.orm import relationship
98

@@ -131,9 +130,3 @@ def before_insert_listener(mapper, connection, target):
131130
@event.listens_for(MoveComment, "before_update")
132131
def before_update(mapper, connection, target):
133132
target.is_missing_authorized()
134-
135-
136-
def _has_changes_that_need_recompute(instance):
137-
if inspect(instance).attrs.type.history.has_changes() or \
138-
inspect(instance).attrs.move.history.has_changes():
139-
return True

geokrety_api_models/user.py

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import random
55

66
import phpass
7-
from sqlalchemy import (Boolean, Column, DateTime, Integer, String, event,
8-
inspect)
7+
from sqlalchemy import Boolean, Column, DateTime, Integer, String, event
98
from sqlalchemy.dialects.mysql import DOUBLE, INTEGER
109
from sqlalchemy.ext.hybrid import hybrid_property
1110
from sqlalchemy.orm import relationship
@@ -198,37 +197,3 @@ def name(cls):
198197
def receive_init(target, args, kwargs):
199198
target.secid = ''.join(random.choice('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') for i in range(84)) # TODO
200199
# target.ip = request.remote_addr
201-
202-
203-
MONITORED_ATTRIBUTES = [
204-
'_name',
205-
'is_admin',
206-
'_password',
207-
'email',
208-
'daily_mails',
209-
'ip',
210-
'language',
211-
'latitude',
212-
'longitude',
213-
'observation_radius',
214-
'country',
215-
'hour',
216-
'statpic_id',
217-
'last_mail_datetime',
218-
'last_login_datetime',
219-
'last_update_datetime',
220-
'secid',
221-
]
222-
223-
224-
def _has_changes_that_need_event(instance):
225-
instance_attrs = inspect(instance).attrs
226-
for attribute in MONITORED_ATTRIBUTES:
227-
if hasattr(instance_attrs, attribute) and \
228-
getattr(instance_attrs, attribute).history.has_changes():
229-
return True
230-
231-
232-
if __name__ == '__main__':
233-
# Check
234-
user = User()

geokrety_api_models/utilities/move_tasks.py

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ def update_geokret_and_moves(session, geokrety, moves=None):
2020
moves = [moves]
2121

2222
for move_id in moves:
23-
update_move_comments_type(move_id)
24-
update_move_country_and_altitude(move_id)
23+
update_move_comments_type(session, move_id)
24+
update_move_country_and_altitude(session, move_id)
2525

2626
for geokret_id in geokrety:
2727
# Enhance Move content
28-
update_move_distances(geokret_id)
28+
update_move_distances(session, geokret_id)
2929
# Enhance GeoKret content
30-
update_geokret_total_moves_count(geokret_id)
31-
update_geokret_holder(geokret_id)
32-
update_geokret_missing(geokret_id)
30+
update_geokret_total_moves_count(session, geokret_id)
31+
update_geokret_holder(session, geokret_id)
32+
update_geokret_missing(session, geokret_id)
3333

3434
try:
3535
session.commit()
@@ -46,11 +46,16 @@ def update_geokret_and_moves(session, geokrety, moves=None):
4646
# *
4747

4848

49-
def update_move_distances(geokret_id):
49+
def update_move_distances(session, geokret_id):
5050
""" Recompute and update all moves distances for a GeoKret
5151
"""
52-
moves = Move.query.filter(Move.geokret_id == geokret_id).order_by(Move.moved_on_datetime.asc())
53-
geokret = Geokret.query.get(geokret_id)
52+
moves = session.query(Move) \
53+
.filter(Move.geokret_id == geokret_id) \
54+
.order_by(Move.moved_on_datetime.asc()) \
55+
.all()
56+
# moves = Move.query.filter(Move.geokret_id == geokret_id).order_by(Move.moved_on_datetime.asc())
57+
geokret = session.query(Geokret) \
58+
.get(geokret_id)
5459

5560
last = None
5661
total_distance = 0
@@ -74,10 +79,11 @@ def update_move_distances(geokret_id):
7479
geokret.distance = total_distance
7580

7681

77-
def update_move_country_and_altitude(move_id):
82+
def update_move_country_and_altitude(session, move_id):
7883
""" Obtain and update country and altitude of a move
7984
"""
80-
move = Move.query.get(move_id)
85+
move = session.query(Move) \
86+
.get(move_id)
8187

8288
if move.latitude is not None and move.longitude is not None:
8389
response = requests.get(
@@ -98,27 +104,29 @@ def update_move_country_and_altitude(move_id):
98104
move.altitude = -32768
99105

100106

101-
def update_geokret_total_moves_count(geokret_id):
107+
def update_geokret_total_moves_count(session, geokret_id):
102108
""" Update GeoKret total move count
103109
"""
104-
moves = Move.query \
110+
moves = session.query(Move) \
105111
.filter(Move.geokret_id == geokret_id) \
106112
.filter(Move.type.in_((MOVE_TYPE_DROPPED, MOVE_TYPE_SEEN, MOVE_TYPE_DIPPED))) \
107113
.order_by(Move.moved_on_datetime.desc())
108114

109-
geokret = Geokret.query.get(geokret_id)
115+
geokret = session.query(Geokret) \
116+
.get(geokret_id)
110117
geokret.caches_count = moves.count()
111118

112119

113-
def update_geokret_holder(geokret_id):
120+
def update_geokret_holder(session, geokret_id):
114121
""" Update GeoKret holder
115122
"""
116-
moves = Move.query \
123+
moves = session.query(Move) \
117124
.filter(Move.geokret_id == geokret_id) \
118125
.filter(Move.type != MOVE_TYPE_COMMENT) \
119126
.order_by(Move.moved_on_datetime.desc())
120127

121-
geokret = Geokret.query.get(geokret_id)
128+
geokret = session.query(Geokret) \
129+
.get(geokret_id)
122130

123131
geokret.holder_id = None
124132
if moves.count():
@@ -130,11 +138,12 @@ def update_geokret_holder(geokret_id):
130138
break
131139

132140

133-
def update_geokret_missing(geokret):
141+
def update_geokret_missing(session, geokret):
134142
""" Update GeoKret missing status
135143
"""
136144
if not isinstance(geokret, Geokret):
137-
geokret = Geokret.query.get(geokret)
145+
geokret = session.query(Geokret) \
146+
.get(geokret)
138147

139148
if geokret.last_position is not None:
140149
for comment in geokret.last_position.comments:
@@ -144,11 +153,11 @@ def update_geokret_missing(geokret):
144153
geokret.missing = False
145154

146155

147-
def update_move_comments_type(move_id):
156+
def update_move_comments_type(session, move_id):
148157
""" Convert move comment type to comment when necessary
149158
"""
150-
move = Move.query.get(move_id)
159+
move = session.query(Move) \
160+
.get(move_id)
151161
if move.type in (MOVE_TYPE_DIPPED, MOVE_TYPE_COMMENT, MOVE_TYPE_GRABBED, MOVE_TYPE_ARCHIVED):
152162
for comment in move.comments:
153163
comment.type = MOVE_COMMENT_TYPE_COMMENT
154-
# session.add(move)

requirements.dev.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
nose>=1.3.7,<2
33
nose-watcher==0.1.3
44
coverage==4.5.2
5+
mixer==6.1.3
6+
responses==0.10.5

setup.py

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

66
setuptools.setup(
77
name="geokrety_api_models",
8-
version="0.0.2",
8+
version="0.0.3",
99
author="Mathieu Alorent",
1010
author_email="[email protected]",
1111
description="The GeoKrety API ORM",

tests/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import os
22
import unittest
33

4+
from mixer.backend.sqlalchemy import Mixer
45
from sqlalchemy.engine import create_engine
56
from sqlalchemy.orm.session import Session
67

78
from geokrety_api_models.base import Base
9+
from .mixins.responses_mixin import ResponsesMixin
810

911

1012
def setup_module():
@@ -26,11 +28,15 @@ def teardown_module():
2628
engine.dispose()
2729

2830

29-
class DatabaseTest(unittest.TestCase):
31+
class DatabaseTest(ResponsesMixin, unittest.TestCase):
3032
def setUp(self):
33+
super(DatabaseTest, self).setUp()
3134
self.__transaction = connection.begin_nested()
3235
self.session = Session(connection)
3336

37+
self.mixer = Mixer(session=self.session, commit=True)
38+
3439
def tearDown(self):
40+
super(DatabaseTest, self).tearDown()
3541
self.session.close()
3642
self.__transaction.rollback()

tests/mixins/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)