Exemple #1
0
class RideshareRequest:
    def __init__(self, requester=None, number_seats=None, event=None, _id=None, db=None):
        self.requester = requester
        self.number_seats = number_seats
        self.event = event

        self.acceptable_rideshares = set()

        self.db = db
        self._id = _id

        if self.db:
            if self._id:
                self._init_with_query({'_id': self._id})
            else:
                db_request = {'requester_id': self.requester._id,
                              'number_seats': self.number_seats,
                              'event_id': self.event._id
                              }
                success = self._init_with_query(db_request)
                if not success:
                    db_request['rideshare_ids'] = []
                    self._id = self.db.requests.insert(db_request)

    def _init_with_query(self, query):
        result = self.db.requests.find_one(query)
        if result:
            self._id = result['_id']
            self.requester = Person(_id=result['requester_id'], db=self.db)
            self.number_seats = result['number_seats']
            self.event = Event(_id=result['event_id'], db=self.db)
            self.acceptable_rideshares = {Rideshare(_id=rid, db=self.db) for rid in result['rideshare_ids']}
        return result is not None

    def add_acceptable_rideshare(self, rideshare):
        before_len = len(self.acceptable_rideshares)
        self.acceptable_rideshares.add(rideshare)
        if len(self.acceptable_rideshares) > before_len:
            self.db.requests.update({'_id': self._id},
                                    {'$set': {'rideshare_ids': [r._id for r in self.acceptable_rideshares]}})

    def __eq__(self, other):
        return self.requester == other.requester and \
            self.number_seats == other.number_seats

    def __ne__(self, other):
        return self.requester != other.requester or \
            self.number_seats != other.number_seats

    def __hash__(self):
        hashable = '{}~{}'.format(self.requester.__hash__(), self.number_seats)
        return hashable.__hash__()
class Rideshare:
    def __init__(self,
                 ride_sharer=None,
                 number_seats=None,
                 event=None,
                 _id=None,
                 db=None):
        """
            ride_sharer is a Person offering a ride
        """
        self.ride_sharer = ride_sharer
        self.number_seats = number_seats
        self.event = event

        self.riders = set()

        self.db = db
        self._id = _id

        if self.db:
            if self._id:
                self._init_with_query({'_id': self._id})
            else:
                db_rideshare = {
                    'ride_sharer_id': self.ride_sharer._id,
                    'number_seats': self.number_seats,
                    'event_id': self.event._id
                }
                success = self._init_with_query(db_rideshare)
                if not success:
                    db_rideshare['rider_ids'] = []
                    self._id = self.db.rideshares.insert(db_rideshare)

    def _init_with_query(self, query):
        result = self.db.rideshares.find_one(query)
        if result:
            self._id = result['_id']
            self.ride_sharer = Person(_id=result['ride_sharer_id'], db=self.db)
            self.number_seats = result['number_seats']
            self.event = Event(_id=result['event_id'], db=self.db)
            self.riders = {
                Person(_id=pid, db=self.db)
                for pid in result['rider_ids']
            }
        return result is not None

    def reserve_seat(self, rider):
        seats_available = len(self.riders) < self.number_seats
        if seats_available:
            before_len = len(self.riders)
            self.riders.add(rider)

            if len(self.riders) > before_len:
                self.db.rideshares.update(
                    {'_id': self._id},
                    {'$set': {
                        'rider_ids': [r._id for r in self.riders]
                    }})

        return seats_available

    def seats_available(self):
        return self.number_seats - len(self.riders)

    def __eq__(self, other):
        return self.ride_sharer == other.ride_sharer and \
            self.number_seats == other.number_seats

    def __ne__(self, other):
        return self.ride_sharer != other.ride_sharer or \
            self.number_seats != other.number_seats

    def __hash__(self):
        hashable = '{}~{}'.format(self.ride_sharer.__hash__(),
                                  self.number_seats)
        return hashable.__hash__()