def privacy(request): OPTIN = "<span class=\"optin policy\">Opt-in</span>" NO = "<span class=\"no policy\">No</span>" YES = "<span class=\"yes policy\">Yes</span>" CACHED = "<span class=\"cached policy\">Cached</span>" SEEBELOW = "See below" services = dict([[x.ID, {"DisplayName": x.DisplayName, "ID": x.ID}] for x in Service.List() if x.ID not in WITHDRAWN_SERVICES]) services["garminconnect"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["strava"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["sporttracks"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["dropbox"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":CACHED}) services["runkeeper"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["rwgps"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["trainingpeaks"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["endomondo"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["motivato"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) for svc_id in SOFT_LAUNCH_SERVICES: if svc_id in services: del services[svc_id] def user_services_sort(service): if not request.user: return 0 if User.IsServiceConnected(request.user, service["ID"]): return 0 else: return 1 services_list = sorted(services.values(), key=user_services_sort) return render(request, "privacy.html", {"services": services_list})
def privacy(request): OPTIN = "<span class=\"optin policy\">Opt-in</span>" NO = "<span class=\"no policy\">No</span>" YES = "<span class=\"yes policy\">Yes</span>" CACHED = "<span class=\"cached policy\">Cached</span>" SEEBELOW = "See below" services = dict([[x.ID, { "DisplayName": x.DisplayName, "ID": x.ID }] for x in Service.List()]) services["garminconnect"].update({ "email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data": NO }) services["strava"].update({ "email": NO, "password": NO, "tokens": YES, "metadata": YES, "data": NO }) services["sporttracks"].update({ "email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data": NO }) services["endomondo"].update({ "email": NO, "password": NO, "tokens": YES, "metadata": YES, "data": NO }) services["dropbox"].update({ "email": NO, "password": NO, "tokens": YES, "metadata": YES, "data": CACHED }) services["runkeeper"].update({ "email": NO, "password": NO, "tokens": YES, "metadata": YES, "data": NO }) services_list = [x for key, x in services.items()] return render(request, "privacy.html", {"services": services_list})
def js_bridge(req): serviceInfo = {} for svc in Service.List(): if svc.ID in WITHDRAWN_SERVICES: continue if req.user is not None: svcRec = User.GetConnectionRecord( req.user, svc.ID) # maybe make the auth handler do this only once? else: svcRec = None info = { "DisplayName": svc.DisplayName, "DisplayAbbreviation": svc.DisplayAbbreviation, "AuthenticationType": svc.AuthenticationType, "UsesExtendedAuth": svc.RequiresExtendedAuthorizationDetails, "AuthorizationURL": svc.UserAuthorizationURL, "NoFrame": svc.AuthenticationNoFrame, "ReceivesActivities": svc.ReceivesActivities, "Configurable": svc.Configurable, "RequiresConfiguration": False # by default } if svcRec: if svc.Configurable: if svc.ID == "dropbox": # dirty hack alert, but better than dumping the auth details in their entirety info["AccessLevel"] = "full" if svcRec.Authorization[ "Full"] else "normal" info["RequiresConfiguration"] = svc.RequiresConfiguration( svcRec) info["Config"] = svcRec.GetConfiguration() info["HasExtendedAuth"] = svcRec.HasExtendedAuthorizationDetails() info[ "PersistedExtendedAuth"] = svcRec.HasExtendedAuthorizationDetails( persisted_only=True) info["ExternalID"] = svcRec.ExternalID info["BlockFlowTo"] = [] info["Connected"] = svcRec is not None serviceInfo[svc.ID] = info if req.user is not None: flowExc = User.GetFlowExceptions(req.user) for exc in flowExc: if exc["Source"]["Service"] not in serviceInfo or exc["Target"][ "Service"] not in serviceInfo: continue # Withdrawn services if "ExternalID" in serviceInfo[exc["Source"][ "Service"]] and exc["Source"]["ExternalID"] != serviceInfo[ exc["Source"]["Service"]]["ExternalID"]: continue # this is an old exception for a different connection if "ExternalID" in serviceInfo[exc["Target"][ "Service"]] and exc["Target"]["ExternalID"] != serviceInfo[ exc["Target"]["Service"]]["ExternalID"]: continue # same as above serviceInfo[exc["Source"]["Service"]]["BlockFlowTo"].append( exc["Target"]["Service"]) return {"js_bridge_serviceinfo": json.dumps(serviceInfo)}
def schedule_trigger_poll(): schedule_data = list(db.trigger_poll_scheduling.find()) print("Scheduler run at %s" % datetime.now()) for svc in Service.List(): if svc.PartialSyncTriggerRequiresPolling: print("Checking %s's %d poll indexes" % (svc.ID, svc.PartialSyncTriggerPollMultiple)) for idx in range(svc.PartialSyncTriggerPollMultiple): svc_schedule = [x for x in schedule_data if x["Service"] == svc.ID and x["Index"] == idx] if not svc_schedule: svc_schedule = {"Service": svc.ID, "Index": idx, "LastScheduled": datetime.min} else: svc_schedule = svc_schedule[0] if datetime.utcnow() - svc_schedule["LastScheduled"] > svc.PartialSyncTriggerPollInterval: svc_schedule["LastScheduled"] = datetime.utcnow() trigger_poll.apply_async(args=[svc.ID, idx], expires=svc.PartialSyncTriggerPollInterval.total_seconds(), time_limit=svc.PartialSyncTriggerPollInterval.total_seconds()) db.trigger_poll_scheduling.update({"Service": svc.ID, "Index": idx}, svc_schedule, upsert=True)
def privacy(request): OPTIN = "<span class=\"optin policy\">Opt-in</span>" NO = "<span class=\"no policy\">No</span>" YES = "<span class=\"yes policy\">Yes</span>" CACHED = "<span class=\"cached policy\">Cached</span>" SEEBELOW = "See below" services = dict([[x.ID, {"DisplayName": x.DisplayName, "ID": x.ID}] for x in Service.List()]) services["garminconnect"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["garminconnect2"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":CACHED}) services["strava"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["sporttracks"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["dropbox"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["runkeeper"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["rwgps"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["trainingpeaks"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["endomondo"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["motivato"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["nikeplus"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["velohero"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["runsense"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["trainerroad"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) services["smashrun"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["beginnertriathlete"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data": NO}) services["trainasone"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["pulsstory"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["setio"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["singletracker"].update({"email": NO, "password": NO, "tokens": YES, "metadata": YES, "data":NO}) services["aerobia"].update({"email": OPTIN, "password": OPTIN, "tokens": NO, "metadata": YES, "data":NO}) for svc_id in itertools.chain(WITHDRAWN_SERVICES, SOFT_LAUNCH_SERVICES): if svc_id in services: del services[svc_id] services_list = sorted(services.values(), key=lambda service: service["ID"]) return render(request, "privacy.html", {"services": services_list})
def providers(req): return {"service_providers": Service.List()}
def exceptSvc(value): connections = [y["Service"] for y in value] return [x for x in Service.List() if x.ID not in connections]
from tapiriik.services import Service from tapiriik.services.ratelimiting import RateLimit for svc in Service.List(): RateLimit.Refresh(svc.ID, svc.GlobalRateLimits)