Skip to content

Commit 09a80a0

Browse files
committed
Activity status implementation
1 parent 1e90059 commit 09a80a0

File tree

4 files changed

+76
-26
lines changed

4 files changed

+76
-26
lines changed

activities/activities.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@
44
from pymongo import DESCENDING
55
from flask_cors import cross_origin
66
from mongoalchemy.util import FieldNotFoundException
7-
from mongoalchemy.exceptions import BadValueException, BadResultException
7+
from mongoalchemy.exceptions import BadValueException
8+
from context import user_context
89

9-
USER_ID = 12
1010
PAGE_SIZE = 15
1111

1212

1313
@app.route('/activities')
14-
@cross_origin()
15-
def list_activities():
14+
@cross_origin(methods=['GET', 'PATCH'])
15+
@user_context
16+
def list_activities(user_id):
1617
try:
1718
page = int(request.args.get('page', 0))
1819
assert page >= 0
1920
except (ValueError, AssertionError):
2021
page = 0
2122

22-
activities = session.query(Activity).filter(Activity.user_id == USER_ID).sort((Activity.created_at, DESCENDING)) \
23+
activities = session.query(Activity).filter(Activity.user_id == user_id).sort((Activity.created_at, DESCENDING)) \
2324
.limit(PAGE_SIZE).skip(page * PAGE_SIZE)
2425

2526
meta = {
@@ -35,11 +36,12 @@ def list_activities():
3536

3637

3738
@app.route('/activities/<activity_id>', methods=['PATCH'])
38-
@cross_origin()
39-
def patch_activity(activity_id):
39+
@cross_origin(methods=['GET', 'PATCH'])
40+
@user_context
41+
def patch_activity(user_id, activity_id):
4042
try:
4143
# TODO introduce validation or json schema
42-
query = session.query(Activity).filter(Activity.mongo_id == activity_id, Activity.user_id == USER_ID)
44+
query = session.query(Activity).filter(Activity.mongo_id == activity_id, Activity.user_id == user_id)
4345
query.set(**request.json).execute()
4446

4547
return jsonify(query.one().to_dict())

activities/documents.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44

55
class Status(Document):
6+
config_collection_name = 'status'
7+
68
new_activities = IntField()
79
user_id = IntField()
810

@@ -27,7 +29,7 @@ class Like(Activity):
2729
config_polymorphic_identity = 'like'
2830

2931
performed_by = StringField()
30-
performer_avatar = StringField()
32+
performer_avatar = StringField(allow_none=True)
3133
post_id = IntField()
3234
post_image = StringField()
3335

@@ -48,7 +50,7 @@ class Comment(Activity):
4850
config_polymorphic_identity = 'comment'
4951

5052
performed_by = StringField()
51-
performer_avatar = StringField()
53+
performer_avatar = StringField(allow_none=True)
5254
post_id = IntField()
5355
post_image = StringField()
5456

@@ -69,7 +71,7 @@ class Repost(Activity):
6971
config_polymorphic_identity = 'repost'
7072

7173
performed_by = StringField()
72-
performer_avatar = StringField()
74+
performer_avatar = StringField(allow_none=True)
7375
post_id = IntField()
7476
post_image = StringField()
7577

@@ -90,7 +92,7 @@ class Follow(Activity):
9092
config_polymorphic_identity = 'follow'
9193

9294
performed_by = StringField()
93-
performer_avatar = StringField()
95+
performer_avatar = StringField(allow_none=True)
9496

9597
def to_dict(self):
9698
return {
@@ -107,7 +109,7 @@ class Mention(Activity):
107109
config_polymorphic_identity = 'mention'
108110

109111
performed_by = StringField()
110-
performer_avatar = StringField()
112+
performer_avatar = StringField(allow_none=True)
111113
post_id = IntField()
112114
post_image = StringField()
113115

activities/status.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,34 @@
1-
from flask import jsonify
1+
from flask import jsonify, request, abort
22
from . import app, session
33
from flask_cors import cross_origin
4+
from documents import Status
5+
from mongoalchemy.util import FieldNotFoundException
6+
from mongoalchemy.exceptions import BadValueException, BadResultException
7+
from context import user_context
48

59

610
@app.route('/status')
7-
@cross_origin()
8-
def get_status():
9-
return jsonify(new_activities=3)
11+
@cross_origin(methods=['GET', 'PUT'])
12+
@user_context
13+
def get_status(user_id):
14+
try:
15+
status = session.query(Status).filter(Status.user_id == user_id).one()
16+
except BadResultException:
17+
status = Status(user_id=user_id, new_activities=0)
18+
session.save(status)
19+
20+
return jsonify(status.to_dict())
1021

1122

1223
@app.route('/status', methods=['PUT'])
13-
@cross_origin()
14-
def put_status():
15-
return jsonify(new_activities=0)
24+
@cross_origin(methods=['GET', 'PUT'])
25+
@user_context
26+
def put_status(user_id):
27+
try:
28+
# TODO introduce validation or json schema
29+
query = session.query(Status).filter(Status.user_id == user_id)
30+
query.set(**request.json).execute()
31+
32+
return jsonify(query.one().to_dict())
33+
except (FieldNotFoundException, BadValueException):
34+
abort(400)

db-data-copy.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,29 @@ def get_legacy_activities(dbcursor):
4848
return dbcursor.fetchall()
4949

5050

51-
def get_collection(dbconf):
51+
def get_legacy_statuses(dbcursor):
52+
query = """
53+
SELECT
54+
id AS user_id,
55+
unread_activities AS new_activities
56+
FROM users
57+
"""
58+
dbcursor.execute(query)
59+
return dbcursor.fetchall()
60+
61+
62+
def get_collection(dbconf, name):
5263
client = MongoClient(dbconf.get('hostname'), dbconf.get('port'))
5364
db = client[dbconf.get('database')]
54-
db.drop_collection('activity')
55-
db.create_collection('activity')
56-
return db.activity
65+
db.drop_collection(name)
66+
db.create_collection(name)
67+
return db[name]
5768

5869

5970
config = load_configuration()
6071
cursor = get_cursor(config.get('mysql', {}))
6172
legacy_activities = get_legacy_activities(cursor)
62-
collection = get_collection(config.get('mongo', {}))
73+
activities_collection = get_collection(config.get('mongo', {}), 'activity')
6374
bar = progressbar.ProgressBar()
6475

6576
for row in bar(legacy_activities):
@@ -82,6 +93,22 @@ def get_collection(dbconf):
8293

8394
activity['clicked'] = True if row['clicked'] == 1 else False
8495

85-
collection.insert_one(activity)
96+
activities_collection.insert_one(activity)
97+
98+
activities_collection.create_index('user_id')
99+
100+
legacy_statuses = get_legacy_statuses(cursor)
101+
statuses_collection = get_collection(config.get('mongo', {}), 'status')
102+
bar = progressbar.ProgressBar()
103+
104+
for row in bar(legacy_statuses):
105+
status = {
106+
'user_id': row['user_id'],
107+
'new_activities': row['new_activities']
108+
}
109+
110+
statuses_collection.insert_one(status)
111+
112+
statuses_collection.create_index('user_id', unique=True)
86113

87114
print 'Migration successful'

0 commit comments

Comments
 (0)