Move plan parsing to the Plan model
- Add `GuestStatus` enum - Add `Plan.guests` property - Made `Plan.going`, `Plan.declined` and `Plan.invited` property accessors to `Plan.guests`
This commit is contained in:
@@ -2,6 +2,14 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import attr
|
||||
import json
|
||||
from ._core import Enum
|
||||
|
||||
|
||||
class GuestStatus(Enum):
|
||||
INVITED = 1
|
||||
GOING = 2
|
||||
DECLINED = 3
|
||||
|
||||
|
||||
@attr.s(cmp=False)
|
||||
@@ -20,9 +28,76 @@ class Plan(object):
|
||||
location_id = attr.ib(None, converter=lambda x: x or "")
|
||||
#: ID of the plan creator
|
||||
author_id = attr.ib(None, init=False)
|
||||
#: List of the people IDs who will take part in the plan
|
||||
going = attr.ib(factory=list, init=False)
|
||||
#: List of the people IDs who won't take part in the plan
|
||||
declined = attr.ib(factory=list, init=False)
|
||||
#: List of the people IDs who are invited to the plan
|
||||
invited = attr.ib(factory=list, init=False)
|
||||
#: Dict of `User` IDs mapped to their `GuestStatus`
|
||||
guests = attr.ib(None, init=False)
|
||||
|
||||
@property
|
||||
def going(self):
|
||||
"""List of the `User` IDs who will take part in the plan."""
|
||||
return [
|
||||
id_
|
||||
for id_, status in (self.guests or {}).items()
|
||||
if status is GuestStatus.GOING
|
||||
]
|
||||
|
||||
@property
|
||||
def declined(self):
|
||||
"""List of the `User` IDs who won't take part in the plan."""
|
||||
return [
|
||||
id_
|
||||
for id_, status in (self.guests or {}).items()
|
||||
if status is GuestStatus.DECLINED
|
||||
]
|
||||
|
||||
@property
|
||||
def invited(self):
|
||||
"""List of the `User` IDs who are invited to the plan."""
|
||||
return [
|
||||
id_
|
||||
for id_, status in (self.guests or {}).items()
|
||||
if status is GuestStatus.INVITED
|
||||
]
|
||||
|
||||
@classmethod
|
||||
def _from_pull(cls, data):
|
||||
rtn = cls(
|
||||
time=data.get("event_time"),
|
||||
title=data.get("event_title"),
|
||||
location=data.get("event_location_name"),
|
||||
location_id=data.get("event_location_id"),
|
||||
)
|
||||
rtn.uid = data.get("event_id")
|
||||
rtn.author_id = data.get("event_creator_id")
|
||||
rtn.guests = {
|
||||
x["node"]["id"]: GuestStatus[x["guest_list_state"]]
|
||||
for x in json.loads(data["guest_state_list"])
|
||||
}
|
||||
return rtn
|
||||
|
||||
@classmethod
|
||||
def _from_fetch(cls, data):
|
||||
rtn = cls(
|
||||
time=data.get("event_time"),
|
||||
title=data.get("title"),
|
||||
location=data.get("location_name"),
|
||||
location_id=str(data["location_id"]) if data.get("location_id") else None,
|
||||
)
|
||||
rtn.uid = data.get("oid")
|
||||
rtn.author_id = data.get("creator_id")
|
||||
rtn.guests = {id_: GuestStatus[s] for id_, s in data["event_members"].items()}
|
||||
return rtn
|
||||
|
||||
@classmethod
|
||||
def _from_graphql(cls, data):
|
||||
rtn = cls(
|
||||
time=data.get("time"),
|
||||
title=data.get("event_title"),
|
||||
location=data.get("location_name"),
|
||||
)
|
||||
rtn.uid = data.get("id")
|
||||
rtn.author_id = data["lightweight_event_creator"].get("id")
|
||||
rtn.guests = {
|
||||
x["node"]["id"]: GuestStatus[x["guest_list_state"]]
|
||||
for x in data["event_reminder_members"]["edges"]
|
||||
}
|
||||
return rtn
|
||||
|
Reference in New Issue
Block a user