Beispiel #1
0
def mark_latest_submission(domain, user_id, app_id, build_id, version, metadata, received_on):
    user = CouchUser.get_by_user_id(user_id, domain)

    if not user or user.is_deleted():
        return

    try:
        received_on_datetime = string_to_utc_datetime(received_on)
    except ValueError:
        return

    last_submission = filter_by_app(user.reporting_metadata.last_submissions, app_id)

    if metadata and metadata.get('appVersion'):
        if not isinstance(metadata['appVersion'], str):
            metadata = format_form_meta_for_es(metadata)

    app_version_info = get_app_version_info(
        domain,
        build_id,
        version,
        metadata
    )

    if _last_submission_needs_update(last_submission,
                                     received_on_datetime,
                                     app_version_info.build_version,
                                     app_version_info.commcare_version):

        if last_submission is None:
            last_submission = LastSubmission()
            user.reporting_metadata.last_submissions.append(last_submission)

        last_submission.submission_date = received_on_datetime
        device_id = metadata.get('deviceID')
        last_submission.device_id = device_id
        last_submission.app_id = app_id
        last_submission.build_id = build_id
        last_submission.build_version = app_version_info.build_version
        last_submission.commcare_version = app_version_info.commcare_version

        if app_version_info.build_version:
            update_latest_builds(user, app_id, received_on_datetime, app_version_info.build_version)

        if _last_submission_needs_update(user.reporting_metadata.last_submission_for_user,
                                         received_on_datetime,
                                         app_version_info.build_version,
                                         app_version_info.commcare_version,
                                         False):

            user.reporting_metadata.last_submission_for_user = last_submission

        app_meta = DeviceAppMeta(
            app_id=app_id,
            build_id=build_id,
            last_submission=received_on_datetime,
        )
        update_device_meta(user, device_id, app_version_info.commcare_version, app_meta, save=False)

        user.save()
Beispiel #2
0
def mark_latest_submission(domain, user_id, app_id, build_id, version, metadata, received_on):
    user = CouchUser.get_by_user_id(user_id, domain)

    if not user or user.is_deleted():
        return

    try:
        received_on_datetime = string_to_utc_datetime(received_on)
    except ValueError:
        return

    last_submission = filter_by_app(user.reporting_metadata.last_submissions, app_id)

    if metadata and metadata.get('appVersion') and not isinstance(metadata['appVersion'], six.string_types):
        metadata = format_form_meta_for_es(metadata)

    app_version_info = get_app_version_info(
        domain,
        build_id,
        version,
        metadata
    )

    if _last_submission_needs_update(last_submission,
                                     received_on_datetime,
                                     app_version_info.build_version,
                                     app_version_info.commcare_version):

        if last_submission is None:
            last_submission = LastSubmission()
            user.reporting_metadata.last_submissions.append(last_submission)

        last_submission.submission_date = received_on_datetime
        device_id = metadata.get('deviceID')
        last_submission.device_id = device_id
        last_submission.app_id = app_id
        last_submission.build_id = build_id
        last_submission.build_version = app_version_info.build_version
        last_submission.commcare_version = app_version_info.commcare_version

        if app_version_info.build_version:
            update_latest_builds(user, app_id, received_on_datetime, app_version_info.build_version)

        if _last_submission_needs_update(user.reporting_metadata.last_submission_for_user,
                                         received_on_datetime,
                                         app_version_info.build_version,
                                         app_version_info.commcare_version,
                                         False):

            user.reporting_metadata.last_submission_for_user = last_submission

        app_meta = DeviceAppMeta(
            app_id=app_id,
            build_id=build_id,
            last_submission=received_on_datetime,
        )
        update_device_meta(user, device_id, app_version_info.commcare_version, app_meta, save=False)

        user.save()
Beispiel #3
0
def fetch_key_records(request, domain):
    last_issued = request.GET.get('last_issued')
    if last_issued:
        last_issued = string_to_datetime(last_issued).replace(tzinfo=None)
    user_id = request.couch_user.user_id
    payload = FetchKeyRecords(domain, user_id, last_issued).get_payload()
    update_device_meta(request.couch_user, request.GET.get('device_id'))
    return HttpResponse(payload)
Beispiel #4
0
def fetch_key_records(request, domain):
    last_issued = request.GET.get('last_issued')
    if last_issued:
        last_issued = string_to_datetime(last_issued).replace(tzinfo=None)
    user_id = request.couch_user.user_id
    payload = FetchKeyRecords(domain, user_id, last_issued).get_payload()
    update_device_meta(request.couch_user, request.GET.get('device_id'))
    return HttpResponse(payload)
Beispiel #5
0
    def test_device_id(self):
        user = self.make_user('*****@*****.**', 'DTO')
        user.update_device_id_last_used('rotary', datetime(1984, 1, 1))
        user.update_device_id_last_used('palm-pilot', datetime(1997, 1, 1))
        user.update_device_id_last_used('blackberry', datetime(2008, 1, 1))
        set_enikshay_device_id(user, 'blackberry')
        user.save()
        self.assertEqual(user.user_data['id_device_number'], 3)

        # Oberyn uses the palm-pilot again, which was device #2
        update_device_meta(user, 'palm-pilot')
        self.assertEqual(user.user_data['id_device_number'], 2)
Beispiel #6
0
def mark_last_synclog(domain,
                      user,
                      app_id,
                      build_id,
                      sync_date,
                      device_id,
                      save=True):
    version = None
    if build_id:
        version = get_version_from_build_id(domain, build_id)

    local_save = update_last_sync(user, app_id, sync_date, version)
    if version:
        local_save |= update_latest_builds(user, app_id, sync_date, version)

    app_meta = None
    if device_id:
        if app_id:
            app_meta = DeviceAppMeta(app_id=app_id,
                                     build_id=build_id,
                                     last_sync=sync_date)
        local_save |= update_device_meta(user,
                                         device_id,
                                         device_app_meta=app_meta,
                                         save=False)

    if local_save and save:
        user.save(fire_signals=False)
    return local_save
Beispiel #7
0
    def process_change(self, change):
        synclog = change.get_document()
        if not synclog:
            return

        version = None
        app_id = None
        try:
            sync_date = string_to_utc_datetime(synclog.get('date'))
        except (ValueError, AttributeError):
            return
        build_id = synclog.get('build_id')
        if build_id:
            version, app_id = get_version_and_app_from_build_id(synclog.get('domain'), build_id)
        user_id = synclog.get('user_id')

        if user_id:
            user = CouchUser.get_by_user_id(user_id)
            save = update_last_sync(user, app_id, sync_date, version)
            if version:
                save |= update_latest_builds(user, app_id, sync_date, version)

            app_meta = None
            device_id = synclog.get('device_id')
            if device_id:
                if app_id:
                    app_meta = DeviceAppMeta(app_id=app_id, build_id=build_id, last_sync=sync_date)
                save |= update_device_meta(user, device_id, device_app_meta=app_meta, save=False)

            if save:
                user.save(fire_signals=False)
Beispiel #8
0
    def test_device_id_same_day(self):
        user = self.make_user('*****@*****.**', 'DTO')
        update_device_meta(user, 'rotary')
        update_device_meta(user, 'palm-pilot')
        update_device_meta(user, 'blackberry')
        palm_pilot_last_used_1 = [device.last_used for device in user.devices
                                  if device.device_id == 'palm-pilot'][0]
        self.assertEqual(user.user_data['id_device_number'], 3)

        # Updating the device ID a second time in the same day doesn't change
        # the entry in user.devices, but it SHOULD update the enikshay user data
        update_device_meta(user, 'palm-pilot')
        palm_pilot_last_used_2 = [device.last_used for device in user.devices
                                  if device.device_id == 'palm-pilot'][0]
        self.assertEqual(palm_pilot_last_used_1, palm_pilot_last_used_2)
        user = CommCareUser.get(user._id)  # make sure it's set in the DB
        self.assertEqual(user.user_data['id_device_number'], 2)
Beispiel #9
0
def update_user_reporting_data(app_build_id, app_id, couch_user, request):
    def _safe_int(val):
        try:
            return int(val)
        except:
            pass

    app_version = _safe_int(request.GET.get('app_version', ''))
    device_id = request.GET.get('device_id', '')
    last_sync_time = request.GET.get('last_sync_time', '')
    num_unsent_forms = _safe_int(request.GET.get('num_unsent_forms', ''))
    num_quarantined_forms = _safe_int(request.GET.get('num_quarantined_forms', ''))
    commcare_version = request.GET.get('cc_version', '')
    save_user = False
    # if mobile cannot determine app version it sends -1
    if app_version and app_version > 0:
        save_user = update_latest_builds(couch_user, app_id, datetime.utcnow(), app_version)
    try:
        last_sync = adjust_text_to_datetime(last_sync_time)
    except iso8601.ParseError:
        try:
            last_sync = string_to_utc_datetime(last_sync_time)
        except (ValueError, OverflowError):
            last_sync = None
    else:
        save_user |= update_last_sync(couch_user, app_id, last_sync, app_version)
    app_meta = DeviceAppMeta(
        app_id=app_id,
        build_id=app_build_id,
        build_version=app_version,
        last_heartbeat=datetime.utcnow(),
        last_sync=last_sync,
        num_unsent_forms=num_unsent_forms,
        num_quarantined_forms=num_quarantined_forms
    )
    save_user |= update_device_meta(
        couch_user,
        device_id,
        commcare_version=commcare_version,
        device_app_meta=app_meta,
        save=False
    )
    if save_user:
        couch_user.save(fire_signals=False)
Beispiel #10
0
def update_user_reporting_data(app_build_id, app_id, couch_user, request):
    def _safe_int(val):
        try:
            return int(val)
        except:
            pass

    app_version = _safe_int(request.GET.get('app_version', ''))
    device_id = request.GET.get('device_id', '')
    last_sync_time = request.GET.get('last_sync_time', '')
    num_unsent_forms = _safe_int(request.GET.get('num_unsent_forms', ''))
    num_quarantined_forms = _safe_int(
        request.GET.get('num_quarantined_forms', ''))
    commcare_version = request.GET.get('cc_version', '')
    save_user = False
    # if mobile cannot determine app version it sends -1
    if app_version and app_version > 0:
        save_user = update_latest_builds(couch_user, app_id, datetime.utcnow(),
                                         app_version)
    try:
        last_sync = adjust_text_to_datetime(last_sync_time)
    except iso8601.ParseError:
        try:
            last_sync = string_to_utc_datetime(last_sync_time)
        except (ValueError, OverflowError):
            last_sync = None
    else:
        save_user |= update_last_sync(couch_user, app_id, last_sync,
                                      app_version)
    app_meta = DeviceAppMeta(app_id=app_id,
                             build_id=app_build_id,
                             build_version=app_version,
                             last_heartbeat=datetime.utcnow(),
                             last_sync=last_sync,
                             num_unsent_forms=num_unsent_forms,
                             num_quarantined_forms=num_quarantined_forms)
    save_user |= update_device_meta(couch_user,
                                    device_id,
                                    commcare_version=commcare_version,
                                    device_app_meta=app_meta,
                                    save=False)
    if save_user:
        couch_user.save(fire_signals=False)
Beispiel #11
0
def mark_last_synclog(domain, user, app_id, build_id, sync_date, latest_build_date, device_id,
        device_app_meta, commcare_version=None, build_profile_id=None, save_user=True):
    version = None
    if build_id:
        version = get_version_from_build_id(domain, build_id)

    local_save = False
    if sync_date:
        # sync_date could be null if this is called from a heartbeat request
        local_save |= update_last_sync(user, app_id, sync_date, version)
    if version:
        local_save |= update_latest_builds(user, app_id, latest_build_date, version, build_profile_id=build_profile_id)

    if device_id:
        local_save |= update_device_meta(user, device_id, commcare_version=commcare_version,
            device_app_meta=device_app_meta, save=False)

    if local_save and save_user:
        user.save(fire_signals=False)
    return local_save
Beispiel #12
0
def get_restore_response(domain, couch_user, app_id=None, since=None, version='1.0',
                         state=None, items=False, force_cache=False,
                         cache_timeout=None, overwrite_cache=False,
                         as_user=None, device_id=None, user_id=None,
                         openrosa_version=None,
                         case_sync=None):

    if user_id and user_id != couch_user.user_id:
        # sync with a user that has been deleted but a new
        # user was created with the same username and password
        from couchforms.openrosa_response import get_simple_response_xml
        from couchforms.openrosa_response import ResponseNature
        response = get_simple_response_xml(
            'Attempt to sync with invalid user.',
            ResponseNature.OTA_RESTORE_ERROR
        )
        return HttpResponse(response, content_type="text/xml; charset=utf-8", status=412), None

    is_demo_restore = couch_user.is_commcare_user() and couch_user.is_demo_user
    if is_demo_restore:
        # if user is in demo-mode, return demo restore
        return demo_user_restore_response(couch_user), None

    uses_login_as = bool(as_user)
    as_user_obj = CouchUser.get_by_username(as_user) if uses_login_as else None
    if uses_login_as and not as_user_obj:
        msg = _(u'Invalid restore as user {}').format(as_user)
        return HttpResponse(msg, status=401), None
    is_permitted, message = is_permitted_to_restore(
        domain,
        couch_user,
        as_user_obj,
    )
    if not is_permitted:
        return HttpResponse(message, status=401), None

    couch_restore_user = as_user_obj if uses_login_as else couch_user
    app = app_meta = None
    if app_id:
        app = get_app(domain, app_id)
        app_meta = DeviceAppMeta(
            app_id=app.master_id,
            build_id=app_id if app.copy_of else None,
            last_sync=datetime.utcnow(),
        )
    update_device_meta(couch_restore_user, device_id, device_app_meta=app_meta)

    restore_user = get_restore_user(domain, couch_user, as_user_obj)
    if not restore_user:
        return HttpResponse('Could not find user', status=404), None

    project = Domain.get_by_name(domain)
    async_restore_enabled = (
        toggles.ASYNC_RESTORE.enabled(domain)
        and openrosa_version
        and LooseVersion(openrosa_version) >= LooseVersion(OPENROSA_VERSION_MAP['ASYNC_RESTORE'])
    )
    restore_config = RestoreConfig(
        project=project,
        restore_user=restore_user,
        params=RestoreParams(
            sync_log_id=since,
            version=version,
            state_hash=state,
            include_item_count=items,
            app=app,
            device_id=device_id,
            openrosa_version=openrosa_version,
        ),
        cache_settings=RestoreCacheSettings(
            force_cache=force_cache or async_restore_enabled,
            cache_timeout=cache_timeout,
            overwrite_cache=overwrite_cache
        ),
        async=async_restore_enabled,
        case_sync=case_sync,
    )
    return restore_config.get_response(), restore_config.timing_context