Пример #1
0
class SolutionRepairOrder(db.Model):
    STATUS_RECEIVED = 1
    STATUS_COMPLETED = 2

    REPAIR_ORDER_STATUSES = (STATUS_RECEIVED, STATUS_COMPLETED)

    timestamp = db.IntegerProperty(indexed=True)
    user = db.UserProperty(indexed=True)
    deleted = db.BooleanProperty(indexed=True, default=False)
    status = db.IntegerProperty(indexed=False)
    description = db.TextProperty(indexed=False)
    sender = SolutionUserProperty()
    picture_url = db.TextProperty(indexed=False)

    solution_inbox_message_key = db.StringProperty(indexed=False)

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @property
    def solution_repair_order_key(self):
        return str(self.key())
Пример #2
0
class EventGuest(db.Model):
    STATUS_GOING = 1
    STATUS_MAYBE = 2
    STATUS_NOT_GOING = 3

    # as in translation keys
    STATUS_KEYS = {
        STATUS_GOING: u'Going',
        STATUS_MAYBE: u'Maybe',
        STATUS_NOT_GOING: u'Not going'
    }

    guest = SolutionUserProperty(indexed=False)
    timestamp = db.IntegerProperty(indexed=False)
    status = db.IntegerProperty(indexed=True)

    chat_key = db.StringProperty(indexed=False)

    @property
    def status_str(self):
        return EventGuest.STATUS_KEYS.get(self.status)

    @property
    def app_user(self):
        return users.User(self.key().name())

    @staticmethod
    def createKey(app_user, event_key):
        return db.Key.from_path(EventGuest.kind(),
                                app_user.email(),
                                parent=event_key)
Пример #3
0
class RestaurantReservation(db.Model):
    STATUS_PLANNED = 1
    STATUS_CANCELED = 2
    STATUS_DELETED = 4
    STATUS_ARRIVED = 8
    STATUS_NOTIFIED = 16
    STATUS_SHIFT_REMOVED = 2147483648

    user = db.UserProperty(indexed=True)
    service_user = db.UserProperty(indexed=True)
    name = db.StringProperty(required=True, indexed=False)
    phone = db.StringProperty(indexed=False)
    date = db.DateTimeProperty(required=True, indexed=False)
    shift_start = db.DateTimeProperty(required=True)
    people = db.IntegerProperty(required=True, indexed=False)
    comment = db.StringProperty(multiline=True, indexed=False)
    status = db.IntegerProperty(required=True, default=STATUS_PLANNED)
    creation_date = db.DateTimeProperty(indexed=False)
    sender = SolutionUserProperty(default=None)
    tables = db.ListProperty(int, indexed=True)

    solution_inbox_message_key = db.StringProperty(indexed=False)

    @property
    def service_identity_user(self):
        return self.service_user

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)
Пример #4
0
class SolutionLoyaltyVisitStamps(db.Model, ArchivedModel):
    app_user = db.UserProperty()
    app_user_info = SolutionUserProperty()

    admin_user = db.UserProperty()
    timestamp = db.IntegerProperty()

    redeemed = db.BooleanProperty(default=False)
    redeemed_admin_user = db.UserProperty()
    redeemed_timestamp = db.IntegerProperty()

    count = db.IntegerProperty()
    x_stamps = db.IntegerProperty(indexed=False)
    winnings = db.TextProperty()

    @property
    def key_str(self):
        return str(self.key())

    @property
    def loyalty_type(self):
        return SolutionLoyaltySettings.LOYALTY_TYPE_STAMPS

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @classmethod
    def load(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('redeemed', False)
        qry.order('-timestamp')
        return qry

    @classmethod
    def get_for_time_period(cls, service_user, service_identity, first_day,
                            last_day):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return cls.all() \
            .ancestor(parent_key_unsafe(service_identity_user, SOLUTION_COMMON)) \
            .filter('redeemed_timestamp >=', first_day) \
            .filter('redeemed_timestamp <', last_day)
Пример #5
0
class SolutionLoyaltyVisitLottery(db.Model, ArchivedModel):
    app_user = db.UserProperty()
    app_user_info = SolutionUserProperty()

    admin_user = db.UserProperty()
    timestamp = db.IntegerProperty()

    redeemed = db.BooleanProperty(default=False)
    redeemed_timestamp = db.IntegerProperty()

    @property
    def key_str(self):
        return str(self.key())

    @property
    def timestamp_day(self):
        return long(self.key().name().split("|")[0])

    @property
    def loyalty_type(self):
        return SolutionLoyaltySettings.LOYALTY_TYPE_LOTTERY

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @classmethod
    def load(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('redeemed =', False)
        qry.order('-timestamp')
        return qry

    @classmethod
    def create_key(cls, service_user, service_identity, app_user,
                   timestamp_day):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return db.Key.from_path(cls.kind(),
                                "%s|%s" % (timestamp_day, app_user.email()),
                                parent=parent_key_unsafe(
                                    service_identity_user, SOLUTION_COMMON))
Пример #6
0
class SolutionLoyaltyScan(db.Model):
    tablet_email = db.StringProperty(indexed=False)
    tablet_app_id = db.StringProperty(indexed=False)
    tablet_name = db.StringProperty(indexed=False)
    user_name = db.StringProperty(indexed=False)
    timestamp = db.IntegerProperty()
    processed = db.BooleanProperty(default=False)

    app_user_info = SolutionUserProperty()

    @property
    def key_str(self):
        return str(self.key())

    @property
    def admin_user(self):
        return create_app_user_by_email(self.tablet_email, self.tablet_app_id)

    @property
    def app_user(self):
        return users.User(self.key().name())

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @classmethod
    def create_key(cls, app_user, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return db.Key.from_path(cls.kind(),
                                app_user.email(),
                                parent=parent_key_unsafe(
                                    service_identity_user, SOLUTION_COMMON))

    @classmethod
    def get_by_service_user(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON)).filter(
                "processed =",
                False).filter("timestamp >",
                              now() - (60 * 60 * 24)).order("timestamp")
Пример #7
0
class SolutionGroupPurchaseSubscription(db.Model):
    sender = SolutionUserProperty(indexed=False)  # app
    name = db.StringProperty(indexed=False)  # cms
    units = db.IntegerProperty(indexed=False)
    timestamp = db.IntegerProperty(indexed=False)
    app_user = db.UserProperty(indexed=True)

    @property
    def id(self):
        return self.key().id()

    @property
    def solution_group_purchase_key(self):
        return self.parent_key()

    @property
    def solution_group_purchase(self):
        return SolutionGroupPurchase.get(self.solution_group_purchase_key)
Пример #8
0
class SolutionMessage(db.Model):
    message = db.TextProperty()
    parent_message_key = db.StringProperty(indexed=False)
    sender = SolutionUserProperty()
    timestamp = db.IntegerProperty(indexed=True)
    deleted = db.BooleanProperty(indexed=True, default=False)
    reply = db.TextProperty()
    reply_enabled = db.BooleanProperty(indexed=True, default=True)

    solution_inbox_message_key = db.StringProperty(indexed=False)

    @property
    def service_user(self):
        return users.User(self.parent_key().name())

    @property
    def solution_message_key(self):
        return str(self.key())
Пример #9
0
class SolutionLoyaltyVisitRevenueDiscount(db.Model, ArchivedModel):
    app_user = db.UserProperty()
    app_user_info = SolutionUserProperty()

    admin_user = db.UserProperty()
    timestamp = db.IntegerProperty()

    redeemed = db.BooleanProperty(default=False)
    redeemed_admin_user = db.UserProperty()
    redeemed_timestamp = db.IntegerProperty()

    price = db.IntegerProperty(indexed=False)  # in euro cents

    @property
    def key_str(self):
        return str(self.key())

    @property
    def loyalty_type(self):
        return SolutionLoyaltySettings.LOYALTY_TYPE_REVENUE_DISCOUNT

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @property
    def price_in_euro(self):
        return '{:0,.2f}'.format(self.price / 100.0)

    def discount_in_euro(self, x_discount):
        return '{:0,.2f}'.format(self.price * x_discount / 10000.0)

    @classmethod
    def load(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('redeemed', False)
        qry.order('-timestamp')
        return qry

    @classmethod
    def get_for_time_period(cls, service_user, service_identity, first_day,
                            last_day):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return cls.all() \
            .ancestor(parent_key_unsafe(service_identity_user, SOLUTION_COMMON)) \
            .filter('redeemed_timestamp >=', first_day) \
            .filter('redeemed_timestamp <', last_day)
Пример #10
0
class SolutionCityWideLotteryVisit(db.Model):
    original_visit_key = db.StringProperty(indexed=True)
    original_loyalty_type = db.IntegerProperty(indexed=False)
    app_user = db.UserProperty()
    app_user_info = SolutionUserProperty()

    timestamp = db.IntegerProperty(indexed=True)
    redeemed = db.BooleanProperty(indexed=True)
    redeemed_timestamp = db.IntegerProperty(indexed=False)

    @property
    def key_str(self):
        return str(self.key())

    @property
    def loyalty_type(self):
        return SolutionLoyaltySettings.LOYALTY_TYPE_LOTTERY

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @property
    def app_id(self):
        return self.parent_key().parent().name()

    @property
    def timestamp_day(self):
        return self.timestamp - (self.timestamp % (3600 * 24))

    @classmethod
    def create_city_parent_key(cls, app_id):
        return db.Key.from_path(u"city_wide_lottery", app_id)

    @classmethod
    def create_parent_key(cls, app_id, service_user, service_identity,
                          app_user):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        city_ancestor_key = cls.create_city_parent_key(app_id)
        service_ancestor_key = db.Key.from_path(SOLUTION_COMMON,
                                                service_identity_user.email(),
                                                parent=city_ancestor_key)
        return db.Key.from_path(cls.kind(),
                                app_user.email(),
                                parent=service_ancestor_key)

    @classmethod
    def list_by_app_id(cls, app_id):
        city_ancestor_key = cls.create_city_parent_key(app_id)
        return cls.all().ancestor(city_ancestor_key).filter(
            'redeemed =', False)

    @classmethod
    def get_visit_by_original_visit_key(cls, app_id, service_user,
                                        service_identity, app_user, visit_key):
        parent_key = cls.create_parent_key(app_id, service_user,
                                           service_identity, app_user)
        return cls.all().ancestor(parent_key).filter("original_visit_key =",
                                                     visit_key).get()

    @classmethod
    def load(cls, app_id):
        city_ancestor_key = cls.create_city_parent_key(app_id)
        qry = cls.all().ancestor(city_ancestor_key)
        qry.filter("redeemed =", False)
        qry.order('-timestamp')
        return qry
Пример #11
0
class SolutionLoyaltyLottery(db.Model):
    schedule_loot_time = db.IntegerProperty()
    timestamp = db.IntegerProperty()
    end_timestamp = db.IntegerProperty()
    winnings = db.TextProperty()

    winner = db.UserProperty()  # app_user
    winner_info = SolutionUserProperty()
    winner_timestamp = db.IntegerProperty()
    skip_winners = db.ListProperty(users.User, indexed=False)

    solution_inbox_message_key = db.StringProperty(indexed=False)
    deleted = db.BooleanProperty(default=False)
    pending = db.BooleanProperty(default=False)
    redeemed = db.BooleanProperty(default=False)
    claimed = db.BooleanProperty(default=False)

    count = db.ListProperty(
        int,
        indexed=False)  # this will be filled in when the lottery is redeemed
    app_users = db.ListProperty(
        users.User,
        indexed=False)  # this will be filled in when the lottery is redeemed

    @property
    def key_str(self):
        return str(self.key())

    @property
    def service_identity_user(self):
        return users.User(self.parent_key().name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @classmethod
    def load_all(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('deleted =', False)
        return qry

    @classmethod
    def load_active(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('deleted =', False)
        qry.filter('redeemed =', False)
        return qry

    @classmethod
    def load_pending(cls, service_user, service_identity):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        qry = cls.all().ancestor(
            parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        qry.filter('deleted =', False)
        qry.filter('pending =', True)
        qry.order("end_timestamp")
        return qry.get()

    @classmethod
    def get_for_time_period(cls, service_user, service_identity, first_day,
                            last_day):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        return cls.all() \
            .ancestor(parent_key_unsafe(service_identity_user, SOLUTION_COMMON)) \
            .filter('winner_timestamp >', first_day) \
            .filter('winner_timestamp <', last_day) \
            .filter('deleted =', False) \
            .filter('claimed', True)
Пример #12
0
class SolutionInboxMessage(db.Model):
    INBOX_NAME_UNREAD = u"unread"
    INBOX_NAME_STARRED = u"starred"
    INBOX_NAME_READ = u"read"
    INBOX_NAME_TRASH = u"trash"
    INBOX_NAME_DELETED = u"deleted"

    CATEGORY_APPOINTMENT = 'appointment'
    CATEGORY_ASK_QUESTION = 'ask_question'
    CATEGORY_BULK_INVITE = 'bulk_invite'
    CATEGORY_GROUP_PURCHASE = 'group_purchase'  # Not yet implemented
    CATEGORY_LOYALTY = 'loyalty'
    CATEGORY_ORDER = 'order'
    CATEGORY_PHARMACY_ORDER = 'pharmacy_order'
    CATEGORY_REPAIR = 'repair'
    CATEGORY_RESTAURANT_RESERVATION = 'restaurant_reservation'
    CATEGORY_SANDWICH_BAR = 'sandwich_bar'
    CATEGORY_AGENDA = 'agenda'
    CATEGORY_CUSTOMER_SIGNUP = 'registration'

    ICON_NAMES = {
        CATEGORY_APPOINTMENT: u'fa-calendar-plus-o',
        CATEGORY_ASK_QUESTION: u'fa-comments-o',
        CATEGORY_BULK_INVITE: u'fa-user-plus',
        CATEGORY_GROUP_PURCHASE: u'fa-shopping-cart',
        CATEGORY_LOYALTY: u'fa-credit-card',
        CATEGORY_ORDER: u'fa-shopping-basket',
        CATEGORY_PHARMACY_ORDER: u'fa-medkit',
        CATEGORY_REPAIR: u'fa-wrench',
        CATEGORY_RESTAURANT_RESERVATION: u'fa-cutlery',
        CATEGORY_SANDWICH_BAR: u'hamburger',
        CATEGORY_AGENDA: u'fa-book',
        CATEGORY_CUSTOMER_SIGNUP: u'fa-sign-in'
    }

    TOPICS = {
        CATEGORY_APPOINTMENT: u'appointment',
        CATEGORY_ASK_QUESTION: u'ask-question',
        CATEGORY_BULK_INVITE: u'settings-bulk-invite',
        CATEGORY_GROUP_PURCHASE: u'group-purchase',
        CATEGORY_LOYALTY: u'loyalty',
        CATEGORY_ORDER: u'order',
        CATEGORY_PHARMACY_ORDER: u'order',
        CATEGORY_REPAIR: u'repair',
        CATEGORY_RESTAURANT_RESERVATION: u'reserve',
        CATEGORY_SANDWICH_BAR: u'order-sandwich',
        CATEGORY_AGENDA: u'agenda',
        CATEGORY_CUSTOMER_SIGNUP: u'registration'
    }

    # for compatibility with older category names
    ICON_NAMES['customer_signup'] = ICON_NAMES[CATEGORY_CUSTOMER_SIGNUP]
    TOPICS['customer_signup'] = TOPICS[CATEGORY_CUSTOMER_SIGNUP]

    category = db.StringProperty(
        indexed=False)  # only filled in on parent message
    category_key = db.StringProperty(
        indexed=False)  # only filled in on parent message

    sent_by_service = db.BooleanProperty(indexed=False)
    sender = SolutionUserProperty()
    message_key = db.StringProperty(
        indexed=False)  # Rogerthat mk (for migrated models this can be None)
    parent_message_key = db.StringProperty()  # Rogerthat pmk
    message_key_by_tag = db.TextProperty()  # only filled in on parent message

    timestamp = db.IntegerProperty(indexed=False)
    last_timestamp = db.IntegerProperty(
        indexed=True)  # only filled in on parent message
    message = db.TextProperty()
    last_message = db.TextProperty()  # only filled in on parent message
    awaiting_first_message = db.BooleanProperty(
        indexed=False)  # only filled in on parent message

    picture_urls = db.StringListProperty(indexed=False)
    video_urls = db.StringListProperty(indexed=False)

    reply_enabled = db.BooleanProperty(
        indexed=False)  # only filled in on parent message
    read = db.BooleanProperty(indexed=True)  # only filled in on parent message
    starred = db.BooleanProperty(
        indexed=True)  # only filled in on parent message
    trashed = db.BooleanProperty(
        indexed=True)  # only filled in on parent message
    deleted = db.BooleanProperty(
        indexed=True)  # only filled in on parent message

    child_messages = db.ListProperty(
        int, indexed=False)  # only filled in on parent message

    # timestamp, only filled in on parent message, only for non-profit associations
    question_asked_timestamp = db.IntegerProperty(default=0)

    @property
    def icon(self):
        if self.category and self.category in SolutionInboxMessage.ICON_NAMES:
            return SolutionInboxMessage.ICON_NAMES[self.category]
        elif self.category:
            logging.error(
                "SolutionInboxMessage icon not found for category '%s' key '%s'",
                self.category, self.key())
        return None

    def icon_color(self, solution):
        if self.category:
            color = u"#FFFFFF" if solution == u"djmatic" else u"#000000"
            return color
        return None

    @property
    def chat_topic_key(self):
        if self.category and self.category in SolutionInboxMessage.TOPICS:
            return SolutionInboxMessage.TOPICS[self.category]
        elif self.category:
            logging.error(
                "SolutionInboxMessage chat_topic_key not found for category '%s' key '%s'",
                self.category, self.key())
        return None

    @property
    def id(self):
        return self.key().id()

    @property
    def service_identity_user(self):
        pkey = self.parent_key()
        if pkey.kind() == self.kind():
            return users.User(pkey.parent().name())
        return users.User(pkey.name())

    @property
    def service_user(self):
        return get_service_user_from_service_identity_user(
            self.service_identity_user)

    @property
    def service_identity(self):
        return get_identity_from_service_identity_user(
            self.service_identity_user)

    @property
    def solution_inbox_message_key(self):
        return str(self.key())

    def get_child_messages(self):
        if self.child_messages:
            return SolutionInboxMessage.get_by_id(self.child_messages, self)
        return []

    @classmethod
    def get_all_unanswered_questions(cls, days):
        return cls.all().filter('question_asked_timestamp <',
                                now() - days * 86400).filter(
                                    'question_asked_timestamp >', 0)

    @classmethod
    def get_all_by_service(cls, service_user, service_identity, start_date):
        service_identity_user = create_service_identity_user_wo_default(
            service_user, service_identity)
        ancestor = parent_key_unsafe(service_identity_user, SOLUTION_COMMON)
        return cls.all().ancestor(ancestor) \
            .filter('parent_message_key', None) \
            .filter('deleted =', False) \
            .filter('last_timestamp >', start_date) \
            .order('-last_timestamp')

    @classmethod
    def create_key(cls, msg_id, parent):
        return db.Key.from_path(cls.kind(), msg_id, parent=parent)