Exemple #1
0
def set_avatar(service_user, image):
    logging.info('%s: Saving avatar' % service_user.email())
    _meta, img_b64 = image.split(',')
    jpg_bytes = base64.b64decode(img_b64)

    def trans():
        avatar_key = SolutionAvatar.create_key(service_user)
        avatar, branding_settings, sln_settings = db.get(
            (avatar_key, SolutionBrandingSettings.create_key(service_user),
             SolutionSettings.create_key(service_user)))
        avatar = avatar or SolutionAvatar(key=avatar_key)
        avatar.picture = db.Blob(jpg_bytes)
        avatar.published = False
        avatar.is_default = False

        to_put = [avatar, sln_settings]
        sln_settings.updates_pending = True
        if branding_settings:
            branding_settings.modification_time = now()
            to_put.append(branding_settings)

        put_and_invalidate_cache(*to_put)

        return sln_settings

    sln_settings = run_in_transaction(trans, xg=True)
    send_message(sln_settings.service_user,
                 'solutions.common.settings.avatar.updated')
    broadcast_updates_pending(sln_settings)
Exemple #2
0
def edit_city_wide_lottery_info(key, winnings, date, x_winners):
    ll_info_edit = SolutionCityWideLottery.get(key)
    if not ll_info_edit:
        return RETURNSTATUS_TO_SUCCESS

    service_user = users.get_current_user()
    sln_settings = get_solution_settings(service_user)

    try:
        now_ = now()
        end_timestamp = date.toEpoch()
        if end_timestamp <= (now_ + 24 * 3600):
            raise BusinessException("end-date-24h-in-future")

        ll_info = SolutionCityWideLottery.load_pending(ll_info_edit.app_id)
        if ll_info_edit.key() != ll_info.key() and end_timestamp <= ll_info.end_timestamp:
            raise BusinessException("lottery-time-bigger-first-upcoming")

        ll_info_edit.end_timestamp = end_timestamp
        ll_info_edit.schedule_loot_time = ll_info_edit.end_timestamp - 24 * 3600
        ll_info_edit.winnings = winnings
        ll_info_edit.x_winners = x_winners
        ll_info_edit.put()

        send_message(service_user, u"solutions.common.loyalty.lottery.update")

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
Exemple #3
0
def add_city_wide_lottery_info(city_app_id, winnings, date, x_winners):
    service_user = users.get_current_user()
    sln_settings = get_solution_settings(service_user)
    try:
        now_ = now()
        end_timestamp = date.toEpoch()
        if end_timestamp <= (now_ + 24 * 3600):
            raise BusinessException("end-date-24h-in-future")

        ll_info = SolutionCityWideLottery.load_pending(city_app_id)
        if ll_info:
            logging.warn("end_timestamp: %s", end_timestamp)
            logging.warn("ll_info.end_timestamp: %s", ll_info.end_timestamp)
            if end_timestamp <= ll_info.end_timestamp:
                raise BusinessException("lottery-time-bigger-first-upcoming")

        ll_info = SolutionCityWideLottery(parent=SolutionCityWideLottery.create_parent_key(city_app_id))
        ll_info.timestamp = now_
        ll_info.end_timestamp = end_timestamp
        ll_info.schedule_loot_time = ll_info.end_timestamp - 24 * 3600
        ll_info.winnings = winnings
        ll_info.x_winners = x_winners
        ll_info.winners = []
        ll_info.winner_info = []
        ll_info.skip_winners = []
        ll_info.deleted = False
        ll_info.pending = True
        ll_info.put()

        send_message(service_user, u"solutions.common.loyalty.lottery.update")

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
Exemple #4
0
def delete_loyalty_lottery_info(key):
    ll_info_delete = SolutionLoyaltyLottery.get(key)
    if not ll_info_delete:
        return RETURNSTATUS_TO_SUCCESS

    service_user = users.get_current_user()
    session_ = users.get_current_session()
    service_identity = session_.service_identity
    sln_settings = get_solution_settings(service_user)

    try:
        ll_info = SolutionLoyaltyLottery.load_pending(service_user, service_identity)
        if ll_info_delete.key() == ll_info.key():
            raise RETURNSTATUS_TO_SUCCESS
        if ll_info_delete.schedule_loot_time > 0:
            ll_info_delete.delete()

        sln_settings.updates_pending = True
        put_and_invalidate_cache(sln_settings)
        broadcast_updates_pending(sln_settings)

        send_message(service_user, u"solutions.common.loyalty.lottery.update", service_identity=service_identity)

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
Exemple #5
0
def set_logo(service_user, image):
    logging.info('%s: Saving logo' % service_user.email())
    _meta, img_b64 = image.split(',')
    jpg_bytes = base64.b64decode(img_b64)

    def trans():
        logo = get_solution_logo(service_user) or SolutionLogo(
            key=SolutionLogo.create_key(service_user))
        logo.picture = db.Blob(jpg_bytes)
        logo.is_default = False

        settings = get_solution_settings(service_user)
        settings.updates_pending = True

        put_and_invalidate_cache(logo, settings)

        deferred.defer(_regenerate_branding_with_logo,
                       service_user,
                       _transactional=True)

        return settings

    common_settings = run_in_transaction(trans, xg=True)
    send_message(common_settings.service_user,
                 'solutions.common.settings.logo.updated')
    broadcast_updates_pending(common_settings)
    def trans():
        voucher_ancestor_key = SolutionCityVoucher.create_parent_key(app_id)
        vouchers = SolutionCityVoucher.get_by_id(voucher_ids,
                                                 voucher_ancestor_key)
        to_put = list()
        for voucher, qr_detail in zip(vouchers, qr_details):
            voucher.image_uri = qr_detail.image_uri
            voucher.content_uri = qr_detail.content_uri
            _set_search_fields(voucher)
            to_put.append(voucher)

            history = SolutionCityVoucherTransaction(parent=voucher)
            history.created = voucher.created
            history.action = SolutionCityVoucherTransaction.ACTION_CREATED
            history.value = 0
            history.service_user = None
            history.service_identity = None
            to_put.append(history)

        sln_qr_export = db.get(sln_qr_export_key)
        sln_qr_export.ready = True
        to_put.append(sln_qr_export)
        put_in_chunks(to_put)
        channel.send_message(
            service_user,
            'solutions.common.city.vouchers.qrcode_export.updated')
Exemple #7
0
def controller(job_key, current_phase=None, retry_interval=0):
    '''Responsible for chaining the different phases'''
    job = _get_job(job_key)
    logging.debug('MigrateServiceJob phase %s->%s (key %s)', current_phase, job.phase, job_key)

    if job.phase == MigrateServiceJob.PHASE_DONE:
        logging.info('Migration of %s to %s completed!', job.from_service_user, job.to_service_user)
        return

    if job.phase == current_phase:
        next_retry_interval = min(retry_interval + 1, 5)
    else:
        worker = PHASES.get(job.phase)
        azzert(worker, 'Unexpected job phase: %s' % job.phase)

        kwargs = dict(job_key=job_key, _queue=MIGRATION_QUEUE)
        deferred.defer(worker, **kwargs)
        channel.send_message(job.executor_user, 'rogerthat.jobs.migrate_service.next_phase',
                             progress=job.estimate_progress(),
                             phase=job.phase)

        next_retry_interval = 1

    deferred.defer(controller, job_key, job.phase, next_retry_interval,
                   _countdown=next_retry_interval, _queue=HIGH_LOAD_CONTROLLER_QUEUE)
Exemple #8
0
def send_message_for_pharmacy_order(service_user, order_key, order_status, message):
    from solutions.common.bizz.messaging import send_inbox_forwarders_message

    azzert(order_status in SolutionPharmacyOrder.ORDER_STATUSES)

    def txn():
        m = SolutionPharmacyOrder.get(order_key)
        azzert(service_user == m.service_user)
        if m.status == SolutionPharmacyOrder.STATUS_RECEIVED and m.status != order_status:
            m.status = order_status
            m.put()
        return m
    order = db.run_in_transaction(txn)

    sm_data = []
    sm_data.append({u"type": u"solutions.common.pharmacy_orders.update"})

    sln_settings = get_solution_settings(service_user)
    if message:
        if order.solution_inbox_message_key:
            sim_parent, _ = add_solution_inbox_message(
                service_user, order.solution_inbox_message_key, True, None, now(), message, mark_as_unread=False, mark_as_read=True)
            send_inbox_forwarders_message(service_user, sim_parent.service_identity, None, message, {
                'if_name': sim_parent.sender.name,
                'if_email': sim_parent.sender.email
            }, message_key=sim_parent.solution_inbox_message_key, reply_enabled=sim_parent.reply_enabled)
            sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, order.service_identity)
            sm_data.append({u"type": u"solutions.common.messaging.update",
                            u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})
        else:
            sln_main_branding = get_solution_main_branding(service_user)
            branding = sln_main_branding.branding_key if sln_main_branding else None

            member = MemberTO()
            member.alert_flags = Message.ALERT_FLAG_VIBRATE
            member.member = order.sender.email
            member.app_id = order.sender.app_id

            messaging.send(parent_key=None,
                           parent_message_key=None,
                           message=message,
                           answers=[],
                           flags=Message.FLAG_ALLOW_DISMISS,
                           members=[member],
                           branding=branding,
                           tag=None,
                           service_identity=order.service_identity)

    elif order.solution_inbox_message_key:
        sim_parent = SolutionInboxMessage.get(order.solution_inbox_message_key)
        if not sim_parent.read:
            sim_parent.read = True
            sim_parent.put()
            deferred.defer(update_user_data_admins, service_user, order.service_identity)
        sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, order.service_identity)
        sm_data.append({u"type": u"solutions.common.messaging.update",
                        u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})

    send_message(service_user, sm_data, service_identity=order.service_identity)
    def get(self):
        user = users.get_current_user()
        self.stop_session()
        channel.send_message(user, u'rogerthat.system.logout')

        cont = self.request.get('continue')
        if cont:
            self.redirect('/%s' % cont)
    def post(self):
        settings = get_server_settings()
        secret = self.request.headers.get("X-Nuntiuz-Secret", None)
        if secret != settings.jabberSecret:
            logging.error(u"Received unauthenticated callback response, ignoring ...")
            return
        sik = self.request.headers.get("X-Nuntiuz-Service-Key", None)
        if not sik:
            logging.error(u"Received invalid Callback response without Service Identifier Key")
            return
        sik = get_sik(sik)
        if not sik:
            logging.error("Received invalid Callback response with unknown Service Identifier Key:\nsik: %s\nbody:\n%s" % (
                self.request.headers.get("X-Nuntiuz-Service-Key", None), self.request.body))
            return
        users.set_user(sik.user)

        raw_result = self.request.body
        try:
            from google.appengine.api.memcache import get  # @UnresolvedImport
            if get(sik.user.email() + "_interactive_logs"):
                content_type = self.request.headers.get('content-type', 'unknown')
                status = self.request.headers.get('X-Nuntiuz-Service-Status', 'unknown')
                if status == "600":
                    status = "unknown"
                result_url = self.request.headers.get('X-Nuntiuz-Service-Result-Url', 'unknown')
                channel.send_message(sik.user, "rogerthat.service.interactive_logs", content_type=content_type,
                                     status=status, result_url=result_url, body=raw_result.decode('utf-8', 'replace'))
        except:
            logging.exception("Error during interactive logging.")

        try:
            result = json.loads(raw_result)
        except Exception:
            raw_result_unicode = raw_result.decode('utf-8', 'replace')
            logging.warning(u"Could not parse request body as JSON!\n" + raw_result_unicode)
            error_code = ERROR_CODE_INVALID_JSON
            error_message = u"The JSON_RPC response could not be parsed as a valid JSON."

            log_service_activity(sik.user, str(time.time()), ServiceLog.TYPE_CALLBACK, ServiceLog.STATUS_ERROR,
                                 None, None, raw_result_unicode, error_code, error_message)
            return
        raw_result_unicode = json.dumps(privatize(deepcopy(result)), ensure_ascii=False)
        logging.info(u"Incoming call back response:\n" + raw_result_unicode)

        if not result:
            error_code = ERROR_CODE_INVALID_JSON
            error_message = u"The JSON_RPC response could not be parsed as a valid json."
            log_service_activity(sik.user, None, ServiceLog.TYPE_CALLBACK, ServiceLog.STATUS_ERROR, None, None,
                                 raw_result_unicode, error_code, error_message)
            return

        from rogerthat.dal import parent_key
        service_api_callback = ServiceAPICallback.get_by_key_name(result["id"], parent=parent_key(sik.user))
        if not service_api_callback:
            logging.warning(u"Service api call back response record not found !")
            return
        _process_callback_result(sik, result, raw_result_unicode, service_api_callback, True)
Exemple #11
0
def _repair_order_received(service_user, message_flow_run_id, member, steps, end_id, end_message_flow_id, parent_message_key,
                   tag, result_key, flush_id, flush_message_flow_id, service_identity, user_details):
    from solutions.common.bizz.messaging import send_inbox_forwarders_message


    logging.info("_flow_member_result_repair_order: \n %s" % steps)

    remarks = _get_value(steps[0], u'message_remarks')
    if steps[1].answer_id == u"positive":
        picture_url = _get_value(steps[1], u'message_picture')
    else:
        picture_url = None

    sln_settings = get_solution_settings(service_user)

    logging.info("Saving repair order from %s" % user_details[0].email)
    service_identity_user = create_service_identity_user_wo_default(service_user, service_identity)
    o = SolutionRepairOrder(parent=parent_key_unsafe(service_identity_user, sln_settings.solution))
    o.description = remarks
    o.sender = SolutionUser.fromTO(user_details[0])
    o.timestamp = steps[1].received_timestamp
    o.status = SolutionRepairOrder.STATUS_RECEIVED
    o.picture_url = picture_url
    o.user = user_details[0].toAppUser() if user_details else None

    msg = common_translate(sln_settings.main_language, SOLUTION_COMMON, 'if-repair-order-received',
                           remarks=remarks)

    message = create_solution_inbox_message(service_user, service_identity, SolutionInboxMessage.CATEGORY_REPAIR, None, False, user_details, steps[1].received_timestamp, msg, True, [picture_url] if picture_url else [])
    o.solution_inbox_message_key = message.solution_inbox_message_key
    o.put()
    message.category_key = unicode(o.key())
    message.put()

    sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, service_identity)

    sm_data = []
    sm_data.append({u"type": u"solutions.common.repair_orders.update"})
    sm_data.append({u"type": u"solutions.common.messaging.update",
                 u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(message, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})

    send_message(service_user, sm_data, service_identity=service_identity)

    attachments = []
    if picture_url:
        att = AttachmentTO()
        att.content_type = AttachmentTO.CONTENT_TYPE_IMG_JPG
        att.download_url = picture_url
        att.name = common_translate(sln_settings.main_language, SOLUTION_COMMON, u'picture')
        att.size = 0
        attachments = [att]

    app_user = user_details[0].toAppUser()

    send_inbox_forwarders_message(service_user, service_identity, app_user, msg, {
            'if_name': user_details[0].name,
            'if_email':user_details[0].email
        }, message_key=message.solution_inbox_message_key, attachments=attachments, reply_enabled=message.reply_enabled)
Exemple #12
0
def twitter_logout(service_user):
    sln_settings = get_solution_settings(service_user)
    sln_settings.twitter_oauth_token = None
    sln_settings.twitter_oauth_token_secret = None
    sln_settings.twitter_username = None
    put_and_invalidate_cache(sln_settings)
    send_message(service_user,
                 u"solutions.common.twitter.updated",
                 username=None)
Exemple #13
0
def _send_event_notification(sln_settings, service_user, service_identity,
                             user_details, event, event_guest):
    from solutions.common.bizz.messaging import send_inbox_forwarders_message

    status = translate(sln_settings.main_language, SOLUTION_COMMON,
                       event_guest.status_str)
    status_message = translate(sln_settings.main_language,
                               SOLUTION_COMMON,
                               u'events_status_notification',
                               status=status,
                               event=event.title)

    create_chat = True
    if event_guest.chat_key:
        create_chat = SolutionInboxMessage.get(event_guest.chat_key) is None

    if create_chat:
        event_key = unicode(event.key())
        message = create_solution_inbox_message(
            service_user, service_identity,
            SolutionInboxMessage.CATEGORY_AGENDA, event_key, False,
            user_details, now(), status_message, True)
        event_guest.chat_key = message.solution_inbox_message_key
        event_guest.put()

        app_user = user_details[0].toAppUser()
    else:
        message, _ = add_solution_inbox_message(service_user,
                                                event_guest.chat_key, False,
                                                user_details, now(),
                                                status_message)
        app_user = None

    send_inbox_forwarders_message(
        service_user,
        service_identity,
        app_user,
        status_message, {
            'if_name': user_details[0].name,
            'if_email': user_details[0].email
        },
        message_key=message.solution_inbox_message_key,
        reply_enabled=message.reply_enabled,
        send_reminder=False)

    # show as last message
    sln_i_settings = get_solution_settings_or_identity_settings(
        sln_settings, service_identity)
    message_to = SolutionInboxMessageTO.fromModel(message, sln_settings,
                                                  sln_i_settings, True)
    send_message(service_user,
                 u'solutions.common.messaging.update',
                 service_identity=service_identity,
                 message=serialize_complex_value(message_to,
                                                 SolutionInboxMessageTO,
                                                 False))
Exemple #14
0
def delete_sandwich_order(service_user, service_identity, sandwich_id, message):
    from solutions.common.bizz.messaging import send_inbox_forwarders_message

    sln_settings = get_solution_settings(service_user)

    def txn():
        m = SandwichOrder.get_by_order_id(service_user, service_identity, sln_settings.solution, sandwich_id)
        azzert(service_user == m.service_user)
        m.deleted = True
        m.put()
        return m

    xg_on = db.create_transaction_options(xg=True)
    sandwich_order = db.run_in_transaction_options(xg_on, txn)

    sm_data = [{u"type": u"solutions.common.sandwich.orders.deleted", u'sandwich_id': sandwich_id}]

    if message:
        if sandwich_order.solution_inbox_message_key:
            sim_parent, _ = add_solution_inbox_message(service_user, sandwich_order.solution_inbox_message_key, True, None, now(), message, mark_as_unread=False, mark_as_read=True, mark_as_trashed=True)
            send_inbox_forwarders_message(service_user, sim_parent.service_identity, None, message, {
                        'if_name': sim_parent.sender.name,
                        'if_email':sim_parent.sender.email
                    }, message_key=sim_parent.solution_inbox_message_key, reply_enabled=sim_parent.reply_enabled)
            sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, sandwich_order.service_identity)
            sm_data.append({u"type": u"solutions.common.messaging.update",
                         u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})

        else:
            branding = get_solution_main_branding(service_user).branding_key
            member = MemberTO()
            member.alert_flags = Message.ALERT_FLAG_VIBRATE
            member.member = sandwich_order.sender.email
            member.app_id = sandwich_order.sender.app_id

            messaging.send(parent_key=None,
                           parent_message_key=None,
                           message=message,
                           answers=[],
                           flags=Message.FLAG_ALLOW_DISMISS,
                           members=[member],
                           branding=branding,
                           tag=None,
                           service_identity=sandwich_order.service_identity)

    elif sandwich_order.solution_inbox_message_key:
        sim_parent = SolutionInboxMessage.get(sandwich_order.solution_inbox_message_key)
        if not sim_parent.trashed and not sim_parent.deleted:
            sim_parent.trashed = True
            sim_parent.put()
            deferred.defer(update_user_data_admins, service_user, sandwich_order.service_identity)
        sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, sandwich_order.service_identity)
        sm_data.append({u"type": u"solutions.common.messaging.update",
                     u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})

    send_message(service_user, sm_data, service_identity=sandwich_order.service_identity)
Exemple #15
0
def reset():
    db.delete(RogerthatBackendErrors.get_key())
    db.delete(list(get_monitored_services_in_trouble_qry()))
    server_settings = get_server_settings()
    send_to = server_settings.supportWorkers
    send_to.append(server_settings.dashboardEmail)
    send_message(map(users.User, send_to),
                 'shop.monitoring.reset',
                 skip_dashboard_user=False)
    return RETURNSTATUS_TO_SUCCESS
Exemple #16
0
def delete_appointment_weekday_timeframe(service_user, appointment_id):
    sln_settings = get_solution_settings(service_user)
    sawt = SolutionAppointmentWeekdayTimeframe.get_by_id(appointment_id, parent_key(service_user, sln_settings.solution))
    if sawt:
        sawt.delete()
        sln_settings = get_solution_settings(service_user)
        sln_settings.updates_pending = True
        put_and_invalidate_cache(sln_settings)

        broadcast_updates_pending(sln_settings)
        send_message(service_user, u"solutions.common.appointment.settings.timeframe.update")
Exemple #17
0
def send_inbox_message_update(sln_settings, message, service_identity=None):
    service_user = sln_settings.service_user
    sln_i_settings = get_solution_settings_or_identity_settings(
        sln_settings, service_identity)
    message_to = SolutionInboxMessageTO.fromModel(message, sln_settings,
                                                  sln_i_settings, True)
    data = serialize_complex_value(message_to, SolutionInboxMessageTO, False)
    channel.send_message(service_user,
                         u'solutions.common.messaging.update',
                         message=data,
                         service_identity=service_identity)
    def trans():
        user_profile = get_user_profile(app_user)
        if not user_profile:
            logging.info("delete account that does not exists: %s", app_user)
            return

        friend_map = get_friends_map(app_user)

        users.clear_user()
        channel.send_message(app_user, u'rogerthat.system.dologout')

        deferred.defer(archiveUserDataAfterDisconnect, app_user, friend_map, user_profile, True, _transactional=True)
Exemple #19
0
def solution_add_admin_to_calendar(service_user, email, tag, result_key,
                                   context, service_identity, user_details):
    from solutions.common.bizz.messaging import POKE_TAG_EVENTS_CONNECT_VIA_SCAN
    info = json.loads(tag[len(POKE_TAG_EVENTS_CONNECT_VIA_SCAN):])
    calendar_id = info.get("calendar_id")
    if not calendar_id:
        return

    sln_settings = get_solution_settings(service_user)
    app_user = user_details[0].toAppUser()
    create_calendar_admin(calendar_id, app_user, service_user,
                          sln_settings.solution)
    send_message(service_user, u"solutions.common.calendar.update")
    def trans():
        user_profile = get_user_profile(app_user)
        if not user_profile:
            logging.info("delete account that does not exists: %s", app_user)
            return

        friend_map = get_friends_map(app_user)

        users.clear_user()
        channel.send_message(app_user, u'rogerthat.system.dologout')

        deferred.defer(archiveUserDataAfterDisconnect, app_user, friend_map, user_profile, True, _transactional=True)
        ActivationLog(timestamp=now(), email=app_user.email(),
                      description='Delete account | %s' % app_user).put()
    def get(self):
        email = self.request.get("email", None)
        data = self.request.get("data", None)
        service_identity = self.request.get("si", None)

        user = users.get_current_user()
        if user:
            users.clear_user()
            channel.send_message(user, u'rogerthat.system.logout')

        if not email or not data:
            logging.warn("not al params received for email: %s and data: %s" % (email, data))
            self.redirect("/")
            return

        try:
            data, _ = self.parse_data(email, data)
        except:
            logging.warn("Could not decipher url! email: %s and data: %s" % (email, data) , exc_info=True)
            self.redirect("/")
            return

        user = users.User(email)

        profile = get_service_or_user_profile(user)
        if not profile:
            logging.warn("profile not found for email: %s" % email)
            self.redirect("/")
            return
        try:
            secret, _ = create_session(user, service_identity=service_identity)
        except ServiceExpiredException:
            return self.redirect('/service_disabled')
        server_settings = get_server_settings()
        set_cookie(self.response, server_settings.cookieSessionName, secret)

        clear_rate_login(user)
        update_user_profile_language_from_headers(profile, self.response.headers)

        params = self.request.GET
        redirect_url = '/'
        if params:
            params = dict((k, v.decode('utf8')) for k, v in params.iteritems())
            del params['email']
            del params['data']
            if "si" in params:
                del params['si']
            redirect_url = "%s?%s" % (redirect_url, urllib.urlencode(params))
        logging.info("Redirecting to url: %s" % redirect_url)
        self.redirect(redirect_url)
def check_i18n_status_of_message_flows(service_user):
    from rogerthat.bizz.service.mfd import render_xml_for_message_flow_design

    def trans():
        translator = get_translator(service_user)
        mfds = get_multilanguage_message_flow_designs_by_status(service_user, MessageFlowDesign.STATUS_VALID)
        for mfd in mfds:
            render_xml_for_message_flow_design(mfd, translator, dict())

        put_and_invalidate_cache(*mfds)

    run_in_transaction(trans, xg=True)

    channel.send_message(service_user, u'rogerthat.mfd.changes')
Exemple #23
0
def _delete_static_content(service_user, static_content_id):
    sln_settings, sc = db.get(
        (SolutionSettings.create_key(service_user),
         SolutionStaticContent.create_key(service_user, static_content_id)))

    def trans():
        sc.provisioned = False
        sc.deleted = True
        sln_settings.updates_pending = True
        db.put([sln_settings, sc])
        return sln_settings

    sln_settings = run_in_transaction(trans, True)
    send_message(service_user, u"solutions.common.service_menu.updated")
    broadcast_updates_pending(sln_settings)
Exemple #24
0
def close_city_wide_lottery_info(key):
    service_user = users.get_current_user()
    try:
        ll_info = SolutionCityWideLottery.get(key)
        if ll_info and not ll_info.pending and not ll_info.deleted:
            ll_info.deleted = True
            ll_info.put()

        send_message(service_user, u"solutions.common.loyalty.lottery.update",
                     service_identity=ll_info.service_identity)

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        sln_settings = get_solution_settings(service_user)
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
def _trigger_update_friend(target_user, friend_map_or_key, profile_info_or_key):
    profile_info = db.get(profile_info_or_key) if isinstance(profile_info_or_key, db.Key) else profile_info_or_key
    logging.info("Sending out updates for %s (%s)", profile_info.name, profile_info.user.email())

    friendTO = send_update_friend_request(target_user, profile_info.user, UpdateFriendRequestTO.STATUS_MODIFIED,
                                          friend_map_or_key)
    if friendTO:
        if profile_info.isServiceIdentity:
            # Send update request over channel API
            friend_dict = serialize_complex_value(friendTO, FriendTO, False)
            # Preventing "InvalidMessageError: Message must be no longer than 32767 chars"
            del friend_dict['appData']
            del friend_dict['userData']
            channel.send_message(target_user, u'rogerthat.friends.update',
                                 friend=friend_dict)
Exemple #26
0
def common_new_chat_message(parent_message_key, message_key, sender, message, answers, timestamp, tag, service_identity,
                            attachments):
    if tag and tag.startswith(POKE_TAG_INBOX_FORWARDING_REPLY):
        info = json.loads(tag[len(POKE_TAG_INBOX_FORWARDING_REPLY):])
        message_key = info['message_key']
        sim_parent = SolutionInboxMessage.get(reconstruct_key(db.Key(message_key)))

        if sim_parent.awaiting_first_message:
            sim_parent.awaiting_first_message = False
            sim_parent.put()
        else:
            service_user = sim_parent.service_user
            sln_settings = get_solution_settings(service_user)
            sent_by_service = True
            if sim_parent.sender.email == sender.email and sim_parent.sender.app_id == sender.app_id:
                sent_by_service = False

            picture_attachments = []
            video_attachments = []
            for a in attachments:
                if a.content_type.startswith("image"):
                    picture_attachments.append(a.download_url)
                if a.content_type.startswith("video"):
                    video_attachments.append(a.download_url)

            if sent_by_service:
                sim_parent, _ = add_solution_inbox_message(service_user, message_key, sent_by_service, [sender], timestamp, message, picture_attachments, video_attachments, mark_as_unread=False, mark_as_read=True)
            else:
                sim_parent, _ = add_solution_inbox_message(service_user, message_key, sent_by_service, [sender], timestamp, message, picture_attachments, video_attachments)

            sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, service_identity)
            send_message(service_user, u"solutions.common.messaging.update",
                         service_identity=service_identity,
                         message=serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False))

            member_sender_user = create_app_user_by_email(sim_parent.sender.email, sim_parent.sender.app_id)
            sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, service_identity)
            members = [MemberTO.from_user(users.User(f)) for f in sln_i_settings.inbox_forwarders]
            if member_sender_user.email() not in sln_i_settings.inbox_forwarders:
                members.append(MemberTO.from_user(member_sender_user))

            users.set_user(service_user)
            try:
                messaging.add_chat_members(sim_parent.message_key, members)
            finally:
                users.clear_user()
    else:
        raise NotImplementedError()
Exemple #27
0
def bulk_invite_result(service_user, service_identity, tag, email, result, user_details):
    if not tag:
        logging.exception("Expected tag in bulk_invite_result")
        return

    if tag in (SERVICE_AUTOCONNECT_INVITE_TAG, APP_BROADCAST_TAG):
        return

    try:
        key = db.Key(tag)
    except db.BadKeyError:
        logging.info('Tag is no db.Key: %s. Ignoring...', tag)
        return

    def trans():
        invite = db.get(reconstruct_key(key))
        if not invite:
            logging.error("Invite object not found in datastore")
            return
        save_message = False
        if "accepted" == result:
            invite.status = RestaurantInvite.STATUS_ACCEPTED
            save_message = True
        else:
            invite.status = RestaurantInvite.STATUS_REJECTED
        invite.put()
        return save_message

    save_message = run_in_xg_transaction(trans)
    if save_message:
        now_ = now()
        sln_settings = get_solution_settings(service_user)
        msg = common_translate(sln_settings.main_language, SOLUTION_COMMON, 'if-accepted-invitation',
                               if_name=user_details[0].name,
                               if_email=user_details[0].email)

        message = create_solution_inbox_message(
            service_user, service_identity, SolutionInboxMessage.CATEGORY_BULK_INVITE, None, False, user_details, now_, msg, False)
        app_user = create_app_user_by_email(user_details[0].email, user_details[0].app_id)
        send_inbox_forwarders_message(service_user, service_identity, app_user, msg, {
            'if_name': user_details[0].name,
            'if_email': user_details[0].email
        }, message_key=message.solution_inbox_message_key, reply_enabled=message.reply_enabled, send_reminder=False)

        sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, service_identity)
        send_message(service_user, u"solutions.common.messaging.update",
                     service_identity=service_identity,
                     message=serialize_complex_value(SolutionInboxMessageTO.fromModel(message, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False))
def saveSettings(request):
    mobile = users.get_current_mobile()
    db_settings = MobileSettings.get(mobile)
    db_settings.recordPhoneCalls = request.callLogging
    db_settings.geoLocationTracking = request.tracking
    db_settings.timestamp = int(time.time())
    db_settings.version += 1
    db_settings.put()
    response = SaveSettingsResponse()
    response.settings = SettingsTO.fromDBSettings(db_settings, get_app_settings(users.get_current_app_id()))
    channel.send_message(
        users.get_current_user(),
        u'rogerthat.settings.update',
        mobile_id=mobile.id)

    return response
Exemple #29
0
    def post(self):
        max_upload_size_mb = 5
        max_upload_size = max_upload_size_mb * 1048576  # 1 MB
        service_user = get_current_user()
        sln_settings = get_solution_settings(service_user)
        name = unicode(self.request.get("name"))
        logging.info('%s uploads an attachment for broadcasting',
                     service_user.email())
        uploaded_file = self.request.POST.get(
            'attachment-files')  # type: FieldStorage
        try:
            if not isinstance(uploaded_file, FieldStorage):
                raise BusinessException(
                    translate(sln_settings.main_language, SOLUTION_COMMON,
                              'please_select_attachment'))
            file_content = uploaded_file.value
            if len(file_content) > max_upload_size:
                raise BusinessException(
                    translate(sln_settings.main_language,
                              SOLUTION_COMMON,
                              'attachment_too_big',
                              max_size=max_upload_size_mb))
            content_type = uploaded_file.type
            if content_type not in AttachmentTO.CONTENT_TYPES:
                raise BusinessException(
                    translate(sln_settings.main_language, SOLUTION_COMMON,
                              'attachment_must_be_of_type'))
            date = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
            filename = '%s/news/%s/%s_%s' % (ROGERTHAT_ATTACHMENTS_BUCKET,
                                             service_user.email(), date,
                                             uploaded_file.filename)
            blob_key = upload_to_gcs(file_content, content_type, filename)
            logging.debug('blob key: %s', blob_key)
            filename = '/'.join(map(urllib.quote, filename.split('/')))
            channel.send_message(
                service_user,
                'solutions.common.broadcast.attachment.upload.success',
                url=get_serving_url(filename),
                name=name)

        except BusinessException as ex:
            channel.send_message(
                service_user,
                'solutions.common.broadcast.attachment.upload.failed',
                message=ex.message)
Exemple #30
0
def _check_reservation(reservation_key, shifts, service_user,
                       service_identity):
    def trans():
        reservation = db.get(reservation_key)
        if is_flag_set(RestaurantReservation.STATUS_CANCELED,
                       reservation.status) or is_flag_set(
                           RestaurantReservation.STATUS_DELETED,
                           reservation.status):
            return False
        current_start = reservation.shift_start.hour * 3600 + reservation.shift_start.minute * 60
        for shift in shifts:
            if not reservation.date.isoweekday() in shift.days:
                continue
            if current_start == shift.start:
                if is_flag_set(RestaurantReservation.STATUS_SHIFT_REMOVED,
                               reservation.status):
                    reservation.status = unset_flag(
                        RestaurantReservation.STATUS_SHIFT_REMOVED,
                        reservation.status)
                    reservation.put()
                    return True
                return False
            if shift.start <= current_start <= shift.end:
                reservation.status = unset_flag(
                    RestaurantReservation.STATUS_SHIFT_REMOVED,
                    reservation.status)
                reservation.shift_start = datetime(
                    reservation.shift_start.year,
                    reservation.shift_start.month, reservation.shift_start.day,
                    shift.start / 3600, (shift.start % 3600) / 60)
                reservation.put()
                return True
        if not is_flag_set(RestaurantReservation.STATUS_SHIFT_REMOVED,
                           reservation.status):
            reservation.status = set_flag(
                RestaurantReservation.STATUS_SHIFT_REMOVED, reservation.status)
            reservation.put()
            return True
        return False

    if db.run_in_transaction(trans):
        send_message(
            service_user,
            u"solutions.restaurant.reservations.shift_changes_conflicts",
            service_identity=service_identity)
Exemple #31
0
    def get(self):
        service_user = users.get_current_user()
        calendarId = long(self.request.get("state"))
        code = self.request.get("code", None)
        error = self.request.get("error", None)
        if error:
            send_message(service_user,
                         u"solutions.common.calendar.google.callback",
                         success=False,
                         calendar_id=calendarId)
        else:
            success = save_google_credentials(service_user, calendarId, code)
            send_message(service_user,
                         u"solutions.common.calendar.google.callback",
                         success=success,
                         calendar_id=calendarId)

        self.response.write("Loading...")
Exemple #32
0
    def get(self):
        service_user_email = self.request.get("s")
        service_user = users.User(service_user_email)
        denied = self.request.get("denied")
        if denied:
            self.response.out.write("""<html>
    <body><h1>Twitter login cancelled, you can close this window now.</h1></body>
    <script>self.close();</script>
</html>""")
        else:
            oauth_token = self.request.get("oauth_token")
            oauth_verifier = self.request.get("oauth_verifier")

            logging.info("service_user_email: %s", service_user_email)
            logging.info("oauth_token: %s", oauth_token)
            logging.info("oauth_verifier: %s", oauth_verifier)

            key = AuthToken.key_name(oauth.TWITTER, oauth_token)
            auth_model = AuthToken.get_by_key_name(key)
            if auth_model:
                server_settings = get_server_settings()
                solution_server_settings = get_solution_server_settings()
                client = oauth.TwitterClient(
                    solution_server_settings.twitter_app_key,
                    solution_server_settings.twitter_app_secret,
                    CALLBACK_URL % (server_settings.baseUrl,
                                    urlencode({"s": service_user.email()})))

                r = client.get_user_info(oauth_token, oauth_verifier, True)

                sln_settings = get_solution_settings(service_user)
                if sln_settings:
                    sln_settings.twitter_oauth_token = r["token"]
                    sln_settings.twitter_oauth_token_secret = r["secret"]
                    sln_settings.twitter_username = r["username"]
                    put_and_invalidate_cache(sln_settings)
                    send_message(service_user,
                                 u"solutions.common.twitter.updated",
                                 username=r["username"])

            self.response.out.write("""<html>
    <body><h1>witter login success, you can close this window now.</h1></body>
    <script>self.close();</script>
</html>""")
    def trans(service_profile):
        azzert(service_profile)
        service_profile_updated = False
        if not service_profile.autoUpdating and not service_profile.updatesPending:
            service_profile.updatesPending = True
            service_profile_updated = True
        if bump_service_version:
            service_profile.version += 1
            service_profile_updated = True
        if clear_broadcast_settings_cache:
            service_profile.addFlag(ServiceProfile.FLAG_CLEAR_BROADCAST_SETTINGS_CACHE)
            service_profile_updated = True

        if service_profile_updated:
            channel.send_message(service_profile.user, 'rogerthat.service.updatesPendingChanged',
                                 updatesPending=service_profile.updatesPending)
            service_profile.put()

        return service_profile.autoUpdating
Exemple #34
0
def send_signup_update_messages(sln_settings, *messages):
    service_identity = ServiceIdentity.DEFAULT
    sln_i_settings = get_solution_settings_or_identity_settings(
        sln_settings, service_identity)

    sm_data = [{u'type': u'solutions.common.customer.signup.update'}]
    for message in messages:
        message_to = SolutionInboxMessageTO.fromModel(message, sln_settings,
                                                      sln_i_settings, True)
        sm_data.append({
            u'type':
            u'solutions.common.messaging.update',
            u'message':
            serialize_complex_value(message_to, SolutionInboxMessageTO, False)
        })

    channel.send_message(sln_settings.service_user,
                         sm_data,
                         service_identity=service_identity)
Exemple #35
0
def delete_group_purchase(service_user, service_identity, group_purchase_id):
    service_identity_user = create_service_identity_user_wo_default(
        service_user, service_identity)

    def txn():
        sln_settings = get_solution_settings(service_user)
        m = SolutionGroupPurchase.get_by_id(
            group_purchase_id,
            parent_key_unsafe(service_identity_user, sln_settings.solution))
        azzert(service_user == m.service_user)
        m.deleted = True
        m.put()

    xg_on = db.create_transaction_options(xg=True)
    db.run_in_transaction_options(xg_on, txn)

    send_message(service_user,
                 u"solutions.common.group_purchase.update",
                 service_identity=service_identity)
Exemple #36
0
def delete_city_wide_lottery_info(key):
    ll_info_delete = SolutionCityWideLottery.get(key)
    if not ll_info_delete:
        return RETURNSTATUS_TO_SUCCESS

    service_user = users.get_current_user()
    sln_settings = get_solution_settings(service_user)

    try:
        ll_info = SolutionCityWideLottery.load_pending(ll_info_delete.app_id)
        if ll_info_delete.key() == ll_info.key():
            raise RETURNSTATUS_TO_SUCCESS
        if ll_info_delete.schedule_loot_time > 0:
            ll_info_delete.delete()

        send_message(service_user, u"solutions.common.loyalty.lottery.update")

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
Exemple #37
0
def reply_sandwich_order(service_user, service_identity, sandwich_id, message=unicode):
    from solutions.common.bizz.messaging import send_inbox_forwarders_message

    sln_settings = get_solution_settings(service_user)
    sandwich_order = SandwichOrder.get_by_order_id(service_user, service_identity, sln_settings.solution, sandwich_id)
    azzert(service_user == sandwich_order.service_user)
    sandwich_order.status = SandwichOrder.STATUS_REPLIED
    sandwich_order.put()

    sm_data = []
    sm_data.append({u"type": u"solutions.common.sandwich.orders.update"})

    if sandwich_order.solution_inbox_message_key:
        sim_parent, _ = add_solution_inbox_message(service_user, sandwich_order.solution_inbox_message_key, True, None, now(), message, mark_as_unread=False, mark_as_read=True)
        send_inbox_forwarders_message(service_user, sim_parent.service_identity, None, message, {
                    'if_name': sim_parent.sender.name,
                    'if_email':sim_parent.sender.email
                }, message_key=sim_parent.solution_inbox_message_key, reply_enabled=sim_parent.reply_enabled)
        sln_i_settings = get_solution_settings_or_identity_settings(sln_settings, sandwich_order.service_identity)
        sm_data.append({u"type": u"solutions.common.messaging.update",
                     u"message": serialize_complex_value(SolutionInboxMessageTO.fromModel(sim_parent, sln_settings, sln_i_settings, True), SolutionInboxMessageTO, False)})
    else:
        sln_main_branding = get_solution_main_branding(service_user)
        branding = sln_main_branding.branding_key if sln_main_branding else None

        member = MemberTO()
        member.alert_flags = Message.ALERT_FLAG_VIBRATE
        member.member = sandwich_order.sender.email
        member.app_id = sandwich_order.sender.app_id

        messaging.send(parent_key=None,
                       parent_message_key=None,
                       message=message,
                       answers=[],
                       flags=Message.FLAG_ALLOW_DISMISS,
                       members=[member],
                       branding=branding,
                       tag=None,
                       service_identity=sandwich_order.service_identity)

    send_message(service_user, sm_data, service_identity=sandwich_order.service_identity)
Exemple #38
0
def put_loyalty_settings(loyalty_type, loyalty_settings, loyalty_website):
    service_user = users.get_current_user()
    try:
        def trans(loyalty_type):
            sln_settings = get_solution_settings(service_user)
            if SolutionModule.HIDDEN_CITY_WIDE_LOTTERY in sln_settings.modules:
                loyalty_type = SolutionLoyaltySettings.LOYALTY_TYPE_CITY_WIDE_LOTTERY
            sln_settings.updates_pending = True

            sln_loyalty_settings = SolutionLoyaltySettings.get_by_user(service_user)

            if sln_loyalty_settings.loyalty_type != loyalty_type:
                sln_loyalty_settings.branding_key = None
                sln_settings.loyalty_branding_hash = None
                sln_loyalty_settings.loyalty_type = loyalty_type

            if sln_loyalty_settings.website != loyalty_website:
                sln_loyalty_settings.modification_time = now()

            sln_loyalty_settings.website = loyalty_website

            if loyalty_type == SolutionLoyaltySettings.LOYALTY_TYPE_REVENUE_DISCOUNT:
                sln_loyalty_settings.x_visits = loyalty_settings.x_visits
                sln_loyalty_settings.x_discount = loyalty_settings.x_discount
            elif loyalty_type == SolutionLoyaltySettings.LOYALTY_TYPE_STAMPS:
                sln_loyalty_settings.x_stamps = loyalty_settings.x_stamps
                sln_loyalty_settings.stamps_type = loyalty_settings.stamps_type
                sln_loyalty_settings.stamps_winnings = loyalty_settings.stamps_winnings
                sln_loyalty_settings.stamps_auto_redeem = loyalty_settings.stamps_auto_redeem

            put_and_invalidate_cache(sln_loyalty_settings, sln_settings)
            return sln_settings

        xg_on = db.create_transaction_options(xg=True)
        sln_settings = db.run_in_transaction_options(xg_on, trans, loyalty_type)
        broadcast_updates_pending(sln_settings)

        send_message(service_user, u"solutions.common.loyalty.settings.update")
        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, e.message)
def stop_debugging(app_user, mobile_id, debug_request=None, notify_user=True):
    # debug_request is not None when debug session timed out

    def trans(mobile):
        stopped = False
        debug_request_from_ds = db.get(StartDebuggingRequest.create_key(app_user, mobile_id))
        if debug_request_from_ds:
            if not debug_request or debug_request.timestamp == debug_request_from_ds.timestamp:
                db.delete_async(debug_request_from_ds)
                start_log_forwarding(app_user, None, mobile)  # target_jid=None ==> will stop log forwarding
                stopped = True
            if not APPSCALE and debug_request_from_ds.target_id.startswith('dbg_'):
                on_trans_committed(try_or_defer, delete_xmpp_account, debug_request_from_ds.target_id, None)

        return stopped

    # stop debugging session after timeout, or when user closed the debugging dialog in the web UI
    xg_on = db.create_transaction_options(xg=True)
    stopped = db.run_in_transaction_options(xg_on, trans, get_mobile_by_id(mobile_id))
    if stopped and notify_user:
        channel.send_message(app_user, 'rogerthat.settings.stopped_debugging')
Exemple #40
0
def add_loyalty_lottery_info(winnings, date):
    service_user = users.get_current_user()
    session_ = users.get_current_session()
    service_identity = session_.service_identity
    sln_settings = get_solution_settings(service_user)
    try:
        now_ = now()
        end_timestamp = date.toEpoch()
        if end_timestamp <= (now_ + 24 * 3600):
            raise BusinessException("end-date-24h-in-future")

        ll_info = SolutionLoyaltyLottery.load_pending(service_user, service_identity)
        if ll_info:
            if end_timestamp <= ll_info.end_timestamp:
                raise BusinessException("lottery-time-bigger-first-upcoming")

        service_identity_user = create_service_identity_user_wo_default(service_user, service_identity)
        ll_info = SolutionLoyaltyLottery(parent=parent_key_unsafe(service_identity_user, SOLUTION_COMMON))
        ll_info.timestamp = now_
        ll_info.end_timestamp = end_timestamp
        ll_info.schedule_loot_time = ll_info.end_timestamp - 24 * 3600
        ll_info.winnings = winnings
        ll_info.winner = None
        ll_info.winner_info = None
        ll_info.winner_timestamp = 0
        ll_info.skip_winners = []
        ll_info.pending = True
        ll_info.redeemed = False
        ll_info.claimed = False
        ll_info.put()

        sln_settings.updates_pending = True
        put_and_invalidate_cache(sln_settings)
        broadcast_updates_pending(sln_settings)

        send_message(service_user, u"solutions.common.loyalty.lottery.update", service_identity=service_identity)

        return RETURNSTATUS_TO_SUCCESS
    except BusinessException, e:
        return ReturnStatusTO.create(False, common_translate(sln_settings.main_language, SOLUTION_COMMON, e.message))
def create_update_friend_requests(helper, updated_user, friend_map, status, extra_conversion_kwargs=None,
                                  skip_mobiles=None):
    """
    Sends the correct request (UpdateFriendRequest or UpdateFriendSetRequest) to the client,
    based on the version of the mobile.

    Args:
        helper(FriendHelper):
        updated_user(users.User): The user which has been updated.
        friend_map(FriendMap): Friend map of the target user
        status(int): The kind of friend update. See UpdateFriendRequestTO.STATUS_*
        extra_conversion_kwargs(dict): Optional kwargs to pass to the FriendTO.fromDBFriendDetail method.
        skip_mobiles([unicode]): mobile accounts that should be skipped.
    Returns:
        list[RpcCAPICall]
    """
    azzert(status in (UpdateFriendRequestTO.STATUS_ADD,
                      UpdateFriendRequestTO.STATUS_DELETE,
                      UpdateFriendRequestTO.STATUS_MODIFIED))
    target_user = friend_map.user

    if status == UpdateFriendRequestTO.STATUS_DELETE:
        friend_detail = None
    else:
        try:
            friend_detail = friend_map.friendDetails[remove_slash_default(updated_user).email()]
        except KeyError:
            logging.warn("%s not found in the friendMap of %s. Not sending updateFriend request with status=%s",
                         remove_slash_default(updated_user), target_user, status)
            friend_detail = None
    if not friend_detail:
        return []
    friend_to = convert_friend(helper, target_user, friend_detail, status, extra_conversion_kwargs)

    capi_calls = do_update_friend_request(target_user, friend_to, status, friend_map, helper, skip_mobiles)
    if friend_to and helper.is_service:
        channel.send_message(target_user, u'rogerthat.friends.update', friend=friend_to.to_dict())
    return capi_calls
def saveSettings(request):
    mobile = users.get_current_mobile()
    db_settings = get_mobile_settings_cached(mobile)
    db_settings.recordPhoneCalls = request.callLogging
    db_settings.geoLocationTracking = request.tracking
    db_settings.timestamp = int(time.time())
    db_settings.version += 1
    db_settings.put()

    user_profile = get_user_profile(mobile.user)
    if MISSING.default(request.push_notifications, None):
        if not user_profile.consent_push_notifications_shown:
            user_profile.consent_push_notifications_shown = True
            user_profile.put()

        rest_request = get_current_request()
        deferred.defer(save_push_notifications_consent, mobile.user, get_headers_for_consent(rest_request),
                       u'yes' if request.push_notifications.enabled else u'no')

    app_settings = get_app_settings(users.get_current_app_id())
    channel.send_message(users.get_current_user(), u'rogerthat.settings.update', mobile_id=mobile.id)

    return SaveSettingsResponse(settings=SettingsTO.fromDBSettings(app_settings, user_profile, db_settings))
def ack_test_broadcast(message):
    test_person = message.broadcast_test_person
    logging.info(u"%s answered broadcast flow" % test_person.email())

    btn_index = message.memberStatusses[message.members.index(test_person)].button_index
    if btn_index == message.buttons[BROADCAST_RETRY_ID].index:
        flow = Broadcast.get(message.broadcast_key).message_flow
        start_flow(add_slash_default(message.sender), message_parent_key=message.pkey, flow=flow, members=[test_person],
                   check_friends=False, result_callback=False,
                   tag=json.dumps({Broadcast.TAG_MC_BROADCAST: message.broadcast_key}), broadcast_type=message.broadcast_type)
    else:
        accepted = btn_index == message.buttons[BROADCAST_ACCEPT_ID].index

        def txn_update_tester_status():
            broadcast = Broadcast.get(message.broadcast_key)
            if broadcast:
                status = Broadcast.TEST_PERSON_STATUS_ACCEPTED if accepted else Broadcast.TEST_PERSON_STATUS_DECLINED
                broadcast.set_status(test_person, status)
                broadcast.put()
            return bool(broadcast)

        if db.run_in_transaction(txn_update_tester_status):
            channel.send_message(get_service_user_from_service_identity_user(message.sender),
                                 u'rogerthat.broadcast.changes', broadcast_key=message.broadcast_key)
def forward_log(app_user, message):
    channel.send_message(app_user, 'rogerthat.settings.log', message=message)
def post(app_user, location, timestamp, recipients):
    def parse_location(friend_language, accuracy, geocoded_results):
        # See https://developers.google.com/maps/documentation/geocoding/#Results
        if accuracy < 100:
            for result in results:
                if "street_address" in result["types"]:
                    return "\n" + localize(friend_language, "Location: %(address)s", address=result["formatted_address"])
            return "\n" + localize(friend_language, "Location: %(address)s", address=results[0]["formatted_address"])

        address_types = ["neighborhood", "sublocality", "locality", "political", "route"]
        for adt in address_types:
            for result in results:
                if adt in result["types"]:
                    return "\n" + localize(friend_language, "Location: %(address)s", address=result["formatted_address"])
        logging.error("Could not parse geo-coded result!")

    loc = GeoPointWithTimestampTO()
    loc.latitude = location.latitude
    loc.longitude = location.longitude
    loc.accuracy = location.accuracy
    loc.timestamp = timestamp

    maps_lat = loc.latitude / 1000000.0
    maps_long = loc.longitude / 1000000.0

    current_user, app_id = get_app_user_tuple(app_user)

    for recipient in (r for r in recipients if r.target == GetLocationRequestTO.TARGET_SERVICE_LOCATION_TRACKER):
        location_with_timestamp = GeoPointWithTimestampTO()
        location_with_timestamp.latitude = location.latitude
        location_with_timestamp.longitude = location.longitude
        location_with_timestamp.accuracy = location.accuracy
        location_with_timestamp.timestamp = timestamp
        handle_service_tracker_results(app_user, add_slash_default(users.User(recipient.friend)), location_with_timestamp)

    to_put = []
    for recipient in (r for r in recipients if r.target in (GetLocationRequestTO.TARGET_MOBILE, GetLocationRequestTO.TARGET_MOBILE_FIRST_REQUEST_AFTER_GRANT)):
        friend_user = create_app_user(users.User(recipient.friend), app_id)
        def trans():
            lr = LocationRequest.get_by_key_name(friend_user.email(), parent=parent_key(app_user))
            if not lr:
                return False
            lr.delete()
            return True
        if not db.run_in_transaction(trans):
            continue

        profile, friend_profile = get_profile_infos([app_user, friend_user], expected_types=[UserProfile, UserProfile])
        if recipient.target == GetLocationRequestTO.TARGET_MOBILE:
            m = localize(friend_profile.language, """Received location of %(name)s.

Accuracy: %(accuracy)sm""", name=profile.name, accuracy=loc.accuracy)
        else:
            m = localize(friend_profile.language, """%(name)s accepted your location sharing request.
Latest information:

Accuracy: %(accuracy)sm""", name=profile.name, accuracy=loc.accuracy)
        url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=%s,%s&sensor=true" % (maps_lat, maps_long)
        logging.info("Fetching URL: %s" % url)
        result = urlfetch.fetch(url)
        logging.info("Fetched result: %s" % result.content)
        logging.info("Result status code: %s" % result.status_code)
        if result.status_code == 200:
            results = json.loads(result.content)
            if results["status"] == "OK" and results["results"]:
                results = results["results"]
                location = parse_location(friend_profile.language, loc.accuracy, results)
                if location:
                    m += location
        button = ButtonTO()
        button.id = u"show_map"
        button.caption = localize(friend_profile.language, "Show map")
        button.action = u"geo://%s,%s" % (str(maps_lat).replace(',', '.'), str(maps_long).replace(',', '.'))
        button.ui_flags = 0
        msg_model = sendMessage(MC_DASHBOARD, [UserMemberTO(friend_user)], Message.FLAG_ALLOW_DISMISS, 0, None, m,
                                [button], None, get_app_by_user(friend_user).core_branding_hash, None, is_mfr=False)
        to_put.append(LocationMessage(key=LocationMessage.create_key(app_user, msg_model.key().name()),
                                      receiver=recipient.friend))
    ndb.put_multi(to_put)
    mobile_recipients = [create_app_user(users.User(r.friend), app_id) for r in recipients if r.target == GetLocationRequestTO.TARGET_MOBILE_FRIENDS_ON_MAP]
    request = LocationResultRequestTO()
    request.friend = current_user.email()
    request.location = loc
    locationResult(get_location_result_response_handler, logError, mobile_recipients, request=request)
    web_recipients = [r for r in recipients if r.target == GetLocationRequestTO.TARGET_WEB]
    for recipient in web_recipients:
        friend_user = create_app_user(users.User(recipient.friend), app_id)
        channel.send_message(friend_user, 'rogerthat.location.location_response', friend=current_user.email(), location=serialize_complex_value(loc, GeoPointWithTimestampTO, False))
 def get(self):
     user = users.get_current_user()
     self.stop_session()
     channel.send_message(user, u'rogerthat.system.logout')
def _send_admin_role_updates(service_identity_user):
    channel.send_message(get_service_user_from_service_identity_user(service_identity_user),
                         u'rogerthat.service.adminsChanged')
def finish_registration(mobile_account, mobileInfo, invitor_code, invitor_secret, ipaddress, anonymous_account=None):
    from rogerthat.service.api import friends as service_api_friends
    m = get_mobile_by_account(mobile_account)
    mobile_key = m.key()
    ms_key = get_mobile_settings_cached(m).key()
    profile_key = get_user_profile_key(m.user)

    def trans():
        mobile, ms, my_profile = db.get((mobile_key, ms_key, profile_key))

        mobile.status = mobile.status | Mobile.STATUS_REGISTERED
        mobile.type = mobileInfo.app_type
        mobile.simCountry = mobileInfo.sim_country if mobileInfo.sim_country != MISSING else None
        mobile.simCountryCode = mobileInfo.sim_country_code if mobileInfo.sim_country_code != MISSING else None
        mobile.simCarrierCode = mobileInfo.sim_carrier_code if mobileInfo.sim_carrier_code != MISSING else None
        mobile.simCarrierName = mobileInfo.sim_carrier_name if mobileInfo.sim_carrier_name != MISSING else None
        mobile.netCountry = mobileInfo.net_country if mobileInfo.net_country != MISSING else None
        mobile.netCountryCode = mobileInfo.net_country_code if mobileInfo.net_country_code != MISSING else None
        mobile.netCarrierCode = mobileInfo.net_carrier_code if mobileInfo.net_carrier_code != MISSING else None
        mobile.netCarrierName = mobileInfo.net_carrier_name if mobileInfo.net_carrier_name != MISSING else None
        mobile.hardwareModel = mobileInfo.device_model_name
        mobile.osVersion = mobileInfo.device_os_version if mobileInfo.device_os_version != MISSING else None
        mobile.localeLanguage = mobileInfo.locale_language if mobileInfo.locale_language and mobileInfo.locale_language != MISSING else DEFAULT_LANGUAGE
        mobile.localeCountry = mobileInfo.locale_country
        mobile.timezone = mobileInfo.timezone if mobileInfo.timezone != MISSING else None
        mobile.timezoneDeltaGMT = mobileInfo.timezone_delta_gmt if mobileInfo.timezone_delta_gmt != MISSING else None

        if mobileInfo.app_major_version != MISSING and mobileInfo.app_minor_version != MISSING:
            ms.majorVersion = mobileInfo.app_major_version
            ms.minorVersion = mobileInfo.app_minor_version

        # This is the official place where we set the profile language
        my_profile.language = mobile.localeLanguage
        my_profile.country = mobile.netCountry or mobile.simCountry or mobile.localeCountry
        my_profile.timezone = mobile.timezone
        my_profile.timezoneDeltaGMT = mobile.timezoneDeltaGMT

        my_profile.mobiles = MobileDetails()
        my_profile.mobiles.addNew(mobile.account, mobile.type, mobile.pushId, mobile.app_id)

        put_and_invalidate_cache(mobile, ms, my_profile)

        deferred.defer(_finishup_mobile_registration, mobile, invitor_code, invitor_secret, ipaddress, ms_key,
                       _transactional=True, _queue=FAST_QUEUE)

        return mobile, my_profile

    mobile, my_profile = run_in_transaction(trans, xg=True)
    channel.send_message(mobile.user, u'com.mobicage.registration.finished')

    registration = get_registration_by_mobile(mobile)
    if registration and registration.installation:
        save_successful_registration(registration, mobile, my_profile)

        if registration.installation.service_identity_user and (registration.installation.qr_url or registration.installation.oauth_state):
            service_identity_user = registration.installation.service_identity_user
            service_user, service_identity = get_service_identity_tuple(service_identity_user)
            svc_profile = get_service_profile(service_user)
            user_details = [UserDetailsTO.fromUserProfile(my_profile)]
            user_app_id = get_app_id_from_app_user(mobile.user)

            # auto_connected_services
            services_to_connect = set()
            if registration.installation.service_callback_result == ACCEPT_AND_CONNECT_ID:
                def trans_update_app_id():
                    si = get_service_identity(service_identity_user)
                    bizz_check(si, "ServiceIdentity %s not found" % service_identity_user)
                    if user_app_id not in si.appIds:
                        si.appIds.append(user_app_id)
                        put_and_invalidate_cache(si)
                run_in_transaction(trans_update_app_id)
                services_to_connect.add(service_identity_user)

            for autoconnect_service_email in registration.installation.auto_connected_services:
                if "/" in autoconnect_service_email:
                    autoconnect_service_identity_user = users.User(autoconnect_service_email)
                else:
                    autoconnect_service_identity_user = create_service_identity_user(
                        users.User(autoconnect_service_email))

                if autoconnect_service_identity_user in services_to_connect:
                    continue
                si = get_service_identity(autoconnect_service_identity_user)
                if si and user_app_id in si.appIds:
                    services_to_connect.add(autoconnect_service_identity_user)

            for service_to_connect in services_to_connect:
                try_or_defer(makeFriends, mobile.user, service_to_connect, original_invitee=None, servicetag=None,
                             origin=None, notify_invitee=False, notify_invitor=False, user_data=None)

            # roles
            if registration.installation.roles:
                roles_to_add = defaultdict(set)
                for r in parse_complex_value(RegistrationResultRolesTO, json.loads(registration.installation.roles), True):
                    for role_id in r.ids:
                        roles_to_add[create_service_identity_user(
                            users.User(r.service), r.identity or ServiceIdentity.DEFAULT)].add(role_id)

                for service_identity_email, role_ids in roles_to_add.iteritems():
                    service_user, identity = get_service_identity_tuple(users.User(service_identity_email))
                    grant_service_roles(service_user, identity, mobile.user, list(role_ids))

            # callback
            if registration.installation.qr_url:
                service_api_friends.register_result(register_result_response_receiver, logServiceError, svc_profile,
                                                    service_identity=service_identity,
                                                    user_details=user_details,
                                                    origin=REGISTRATION_ORIGIN_QR)
            elif registration.installation.oauth_state:
                service_api_friends.register_result(register_result_response_receiver, logServiceError, svc_profile,
                                                    service_identity=service_identity,
                                                    user_details=user_details,
                                                    origin=REGISTRATION_ORIGIN_OAUTH)

        else:
            app = get_app_by_id(get_app_id_from_app_user(mobile.user))
            if app.admin_services:
                service_profiles = filter(None, db.get((get_profile_key(users.User(e)) for e in app.admin_services)))
                if service_profiles:
                    user_details = [UserDetailsTO.fromUserProfile(my_profile)]
                    for service_profile in service_profiles:
                        service_api_friends.register_result(register_result_response_receiver,
                                                            logServiceError,
                                                            service_profile,
                                                            service_identity=ServiceIdentity.DEFAULT,
                                                            user_details=user_details,
                                                            origin=REGISTRATION_ORIGIN_DEFAULT)

    if anonymous_account:
        deferred.defer(migrate_anonymous_account, anonymous_account, mobile.user)

    return mobile
def finish_registration(mobile_account, mobileInfo, accounts, invitor_code, invitor_secret, ipaddress):
    from rogerthat.service.api import friends as service_api_friends
    m = get_mobile_by_account(mobile_account)
    mobile_key = m.key()
    ms_key = MobileSettings.get(m).key()
    profile_key = get_user_profile_key(m.user)

    def trans():
        mobile, ms, my_profile = db.get((mobile_key, ms_key, profile_key))

        mobile.status = mobile.status | Mobile.STATUS_REGISTERED
        mobile.type = mobileInfo.app_type
        mobile.simCountry = mobileInfo.sim_country if mobileInfo.sim_country != MISSING else None
        mobile.simCountryCode = mobileInfo.sim_country_code if mobileInfo.sim_country_code != MISSING else None
        mobile.simCarrierCode = mobileInfo.sim_carrier_code if mobileInfo.sim_carrier_code != MISSING else None
        mobile.simCarrierName = mobileInfo.sim_carrier_name if mobileInfo.sim_carrier_name != MISSING else None
        mobile.netCountry = mobileInfo.net_country if mobileInfo.net_country != MISSING else None
        mobile.netCountryCode = mobileInfo.net_country_code if mobileInfo.net_country_code != MISSING else None
        mobile.netCarrierCode = mobileInfo.net_carrier_code if mobileInfo.net_carrier_code != MISSING else None
        mobile.netCarrierName = mobileInfo.net_carrier_name if mobileInfo.net_carrier_name != MISSING else None
        mobile.hardwareModel = mobileInfo.device_model_name
        mobile.osVersion = mobileInfo.device_os_version if mobileInfo.device_os_version != MISSING else None
        mobile.localeLanguage = mobileInfo.locale_language if mobileInfo.locale_language and mobileInfo.locale_language != MISSING else DEFAULT_LANGUAGE
        mobile.localeCountry = mobileInfo.locale_country
        mobile.timezone = mobileInfo.timezone if mobileInfo.timezone != MISSING else None
        mobile.timezoneDeltaGMT = mobileInfo.timezone_delta_gmt if mobileInfo.timezone_delta_gmt != MISSING else None

        if mobileInfo.app_major_version != MISSING and mobileInfo.app_minor_version != MISSING:
            ms.majorVersion = mobileInfo.app_major_version
            ms.minorVersion = mobileInfo.app_minor_version

        # This is the official place where we set the profile language
        my_profile.language = mobile.localeLanguage
        my_profile.country = mobile.netCountry or mobile.simCountry or mobile.localeCountry
        my_profile.timezone = mobile.timezone
        my_profile.timezoneDeltaGMT = mobile.timezoneDeltaGMT

        my_profile.mobiles = MobileDetails()
        my_profile.mobiles.addNew(mobile.account, mobile.type, mobile.pushId, mobile.app_id)

        mobile.put()
        ms.put()
        my_profile.put()

        deferred.defer(_finishup_mobile_registration, mobile, accounts, invitor_code, invitor_secret, ipaddress,
                       ms_key, _transactional=True)

        return mobile, my_profile

    xg_on = db.create_transaction_options(xg=True)
    mobile, my_profile = db.run_in_transaction_options(xg_on, trans)
    channel.send_message(mobile.user, u'com.mobicage.registration.finished')
    typestr = "Unknown type"
    try:
        typestr = Mobile.typeAsString(mobile.type)
    except ValueError:
        pass

    server_settings = get_server_settings()
    registration = get_registration_by_mobile(mobile)
    if registration:
        InstallationLog(parent=registration.installation, timestamp=now(), registration=registration,
                        mobile=mobile, profile=my_profile, description="Registration successful.").put()

        if registration.installation and registration.installation.qr_url:
            service_user = get_service_user_from_service_identity_user(registration.installation.service_identity_user)
            service_identity = get_identity_from_service_identity_user(registration.installation.service_identity_user)
            svc_profile = get_service_profile(service_user)
            user_details = [UserDetailsTO.fromUserProfile(my_profile)]

            if registration.installation.service_callback_result == ACCEPT_AND_CONNECT_ID:
                service_identity_user = create_service_identity_user(service_user, service_identity)
                si = get_service_identity(service_identity_user)
                bizz_check(si, "ServiceIdentity %s not found" % service_identity_user)
                xmpp.send_message(server_settings.xmppInfoMembers,
                                  "User %s registered %s (%s) with account:\n%s\nFor service %s %s" % (
                                  mobile.user, mobile.hardwareModel, typestr, mobile.account, si.name,
                                  service_identity_user), message_type=xmpp.MESSAGE_TYPE_CHAT)
                app_id = get_app_id_from_app_user(mobile.user)
                if app_id not in si.appIds:
                    si.appIds.append(app_id)
                    put_and_invalidate_cache(si)
                try_or_defer(makeFriends, mobile.user, service_identity_user, original_invitee=None, servicetag=None,
                             origin=None, notify_invitee=False, notify_invitor=False, user_data=None)
            else:
                xmpp.send_message(server_settings.xmppInfoMembers, "User %s registered %s (%s) with account:\n%s" % (
                mobile.user, mobile.hardwareModel, typestr, mobile.account), message_type=xmpp.MESSAGE_TYPE_CHAT)

            service_api_friends.register_result(register_result_response_receiver, logServiceError, svc_profile,
                                                service_identity=service_identity,
                                                user_details=user_details,
                                                origin=REGISTRATION_ORIGIN_QR)
        else:
            xmpp.send_message(server_settings.xmppInfoMembers, "User %s registered %s (%s) with account:\n%s" % (
            mobile.user, mobile.hardwareModel, typestr, mobile.account), message_type=xmpp.MESSAGE_TYPE_CHAT)
            app = get_app_by_id(get_app_id_from_app_user(mobile.user))
            if app.admin_services:
                service_profiles = filter(None, db.get((get_profile_key(users.User(e)) for e in app.admin_services)))
                if service_profiles:
                    user_details = [UserDetailsTO.fromUserProfile(my_profile)]
                    for service_profile in service_profiles:
                        service_api_friends.register_result(register_result_response_receiver,
                                                            logServiceError,
                                                            service_profile,
                                                            service_identity=ServiceIdentity.DEFAULT,
                                                            user_details=user_details,
                                                            origin=REGISTRATION_ORIGIN_DEFAULT)
    else:
        xmpp.send_message(server_settings.xmppInfoMembers,
                          "User %s registered %s (%s) with account:\n%s\nBut registration model was not found!" % (
                          mobile.user, mobile.hardwareModel, typestr, mobile.account),
                          message_type=xmpp.MESSAGE_TYPE_CHAT)

    return mobile
def forward_log(app_user, message):
    channel.send_message(app_user, 'rogerthat.settings.log', message=message, silent=True)  # don't slog
def cleanup_sessions(service_user):
    for user_profile_key in UserProfile.all(keys_only=True).filter('owningServiceEmails', service_user.email()):
        drop_sessions_of_user(users.User(user_profile_key.name()))
    drop_sessions_of_user(service_user)
    send_message(service_user, 'rogerthat.system.logout')
def _send_service_role_grants_updates(service_user):
    channel.send_message(service_user, u'rogerthat.service.role.grants.updated')