def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_label is None: project.app_version_label = '1.0' app_keys = project.get_parsed_appkeys() send_td_event('cloudpebble_open_project', request=request, project=project) try: token = request.user.social_auth.get(provider='pebble').extra_data['access_token'] except: token = '' return render(request, 'ide/project.html', { 'project': project, 'app_keys': app_keys, 'font_css': settings.TYPOGRAPHY_CSS, 'libpebble_proxy': json.dumps(settings.LIBPEBBLE_PROXY), 'token': token, 'phone_shorturl': settings.PHONE_SHORTURL, 'supported_platforms': project.supported_platforms, 'regexes': regexes, 'regexes_json': json.dumps(regexes.regex_dictionary) })
def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_label is None: project.app_version_label = '1.0' app_keys = project.get_parsed_appkeys() supported_platforms = ["aplite", "basalt"] if project.project_type != 'pebblejs' and project.sdk_version != '2': supported_platforms.append("chalk") send_td_event('cloudpebble_open_project', request=request, project=project) try: token = request.user.social_auth.get(provider='pebble').extra_data['access_token'] except: token = '' return render(request, 'ide/project.html', { 'project': project, 'app_keys': app_keys, 'font_css': settings.TYPOGRAPHY_CSS, 'libpebble_proxy': json.dumps(settings.LIBPEBBLE_PROXY), 'token': token, 'phone_shorturl': settings.PHONE_SHORTURL, 'supported_platforms': supported_platforms, 'regexes': regexes, 'regexes_json': json.dumps(regexes.regex_dictionary) })
def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_label is None: project.app_version_label = '1.0' app_keys = project.get_parsed_appkeys() supported_platforms = ["aplite", "basalt"] if project.project_type != 'pebblejs' and project.sdk_version != '2': supported_platforms.append("chalk") send_td_event('cloudpebble_open_project', request=request, project=project) try: token = request.user.social_auth.get(provider='pebble').extra_data['access_token'] except: token = '' return render(request, 'ide/project.html', { 'project': project, 'app_keys': app_keys, 'font_css': settings.TYPOGRAPHY_CSS, 'libpebble_proxy': json.dumps(settings.LIBPEBBLE_PROXY), 'token': token, 'phone_shorturl': settings.PHONE_SHORTURL, 'supported_platforms': supported_platforms, 'version_regex': SDK_VERSION_REGEX, 'npm_manifest_support_enabled': settings.NPM_MANIFEST_SUPPORT })
def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_label is None: project.app_version_label = '1.0' send_keen_event('cloudpebble', 'cloudpebble_open_project', request=request, project=project) app_keys = sorted(json.loads(project.app_keys).iteritems(), key=lambda x: x[1]) try: token = request.user.social_auth.get(provider='pebble').extra_data['access_token'] except: token = '' return render(request, 'ide/project.html', { 'project': project, 'app_keys': app_keys, 'font_css': settings.TYPOGRAPHY_CSS, 'libpebble_proxy': json.dumps(settings.LIBPEBBLE_PROXY), 'token': token, 'phone_shorturl': settings.PHONE_SHORTURL, })
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_keen_event('cloudpebble', 'cloudpebble_gist_not_found', user=user, data={'data': {'gist_id': gist_id}}) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' is_native = True if 'appinfo.json' in files: settings = json.loads(files['appinfo.json'].content) if len(files) == 2 and 'simply.js' in files: is_native = False else: settings = {} if len(files) == 1 and 'simply.js' in files: is_native = False project_settings = { 'name': settings.get('longName', default_name), 'owner': user, 'sdk_version': 2, 'app_uuid': generate_half_uuid(), 'app_short_name': settings.get('shortName', default_name), 'app_long_name': settings.get('longName', default_name), 'app_company_name': settings.get('companyName', user.username), 'app_version_code': 1, 'app_version_label': settings.get('versionLabel', '1.0'), 'app_is_watchface': settings.get('watchapp', {}).get('watchface', False), 'app_capabilities': ','.join(settings.get('capabilities', [])), 'app_keys': dict_to_pretty_json(settings.get('appKeys', {})), 'project_type': 'native' if is_native else 'simplyjs' } with transaction.commit_on_success(): project = Project.objects.create(**project_settings) if is_native: for filename in gist.files: if filename.endswith('.c') or filename.endswith('.h') or filename == 'pebble-js-app.js': # Because gists can't have subdirectories. if filename == 'pebble-js-app.js': cp_filename = 'js/pebble-js-app.js' else: cp_filename = filename source_file = SourceFile.objects.create(project=project, file_name=cp_filename) source_file.save_file(gist.files[filename].content) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_file(gist.files['simply.js'].content) send_keen_event('cloudpebble', 'cloudpebble_gist_import', project=project, data={'data': {'gist_id': gist_id}}) return project.id
def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_code is None: project.app_version_code = 1 if project.app_version_label is None: project.app_version_label = '1.0' send_keen_event('cloudpebble', 'cloudpebble_open_project', request=request, project=project) app_keys = json.loads(project.app_keys).iteritems() return render(request, 'ide/project.html', {'project': project, 'app_keys': app_keys})
def view_project(request, project_id): project = get_object_or_404(Project, pk=project_id, owner=request.user) if project.app_uuid is None: project.app_uuid = generate_half_uuid() if project.app_company_name is None: project.app_company_name = request.user.username if project.app_short_name is None: project.app_short_name = project.name if project.app_long_name is None: project.app_long_name = project.app_short_name if project.app_version_code is None: project.app_version_code = 1 if project.app_version_label is None: project.app_version_label = '1.0' send_keen_event('cloudpebble', 'cloudpebble_open_project', request=request, project=project) app_keys = json.loads(project.app_keys).iteritems() return render(request, 'ide/project.html', { 'project': project, 'app_keys': app_keys })
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_td_event('cloudpebble_gist_not_found', data={'data': {'gist_id': gist_id}}, user=user) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' project_type = 'native' default_settings = { 'name': default_name, 'app_short_name': default_name, 'app_long_name': default_name, 'app_company_name': user.username, 'app_version_label': '1.0', 'app_is_watchface': False, 'app_is_hidden': False, 'app_is_shown_on_communication': False, 'app_capabilities': '[]', 'app_keys': '{}', 'project_type': 'native', 'app_modern_multi_js': False, 'sdk_version': '2' } if len(files) == 1 or ((APPINFO_MANIFEST in files or PACKAGE_MANIFEST in files) and len(files) == 2): if 'simply.js' in files: default_settings['project_type'] = 'simplyjs' elif 'app.js' in files: default_settings['project_type'] = 'pebblejs' media = [] # Using defaultdict we can load project settings from a manifest dict which # has values that default to None. This way, we can delegate if PACKAGE_MANIFEST in files: content = json.loads(files[PACKAGE_MANIFEST].content) package = defaultdict(lambda: None) package.update(content) package['pebble'] = defaultdict(lambda: None) package['pebble'].update(content.get('pebble', {})) manifest_settings, media, dependencies = load_manifest_dict(package, PACKAGE_MANIFEST, default_project_type=None) if settings.NPM_MANIFEST_SUPPORT: default_settings['app_keys'] = '[]' elif APPINFO_MANIFEST in files: content = json.loads(files['appinfo.json'].content) package = defaultdict(lambda: None) package.update(content) manifest_settings, media, dependencies = load_manifest_dict(package, APPINFO_MANIFEST, default_project_type=None) else: manifest_settings = {} dependencies = {} fixed_settings = { 'owner': user, 'app_uuid': generate_half_uuid() } project_settings = {} project_settings.update(default_settings) project_settings.update({k: v for k, v in manifest_settings.iteritems() if v is not None}) project_settings.update(fixed_settings) with transaction.atomic(): project = Project.objects.create(**project_settings) project.set_dependencies(dependencies) if project_type != 'simplyjs': for filename in gist.files: if (project_type == 'native' and filename.endswith('.c') or filename.endswith('.h')) or filename.endswith('.js'): # Because gists can't have subdirectories. if filename == 'pebble-js-app.js': cp_filename = 'js/pebble-js-app.js' else: cp_filename = filename source_file = SourceFile.objects.create(project=project, file_name=cp_filename) source_file.save_file(gist.files[filename].content) resources = {} for resource in media: kind = resource['type'] def_name = resource['name'] filename = resource['file'] regex = resource.get('characterRegex', None) tracking = resource.get('trackingAdjust', None) memory_format = resource.get('memoryFormat', None) storage_format = resource.get('storageFormat', None) space_optimisation = resource.get('spaceOptimization', None) is_menu_icon = resource.get('menuIcon', False) compatibility = resource.get('compatibility', None) if filename not in gist.files: continue if filename not in resources: resources[filename] = ResourceFile.objects.create(project=project, file_name=filename, kind=kind, is_menu_icon=is_menu_icon) # We already have this as a unicode string in .content, but it shouldn't have become unicode # in the first place. default_variant = ResourceVariant.objects.create(resource_file=resources[filename], tags=ResourceVariant.TAGS_DEFAULT) default_variant.save_file(urllib2.urlopen(gist.files[filename].raw_url)) ResourceIdentifier.objects.create( resource_file=resources[filename], resource_id=def_name, character_regex=regex, tracking=tracking, compatibility=compatibility, memory_format=memory_format, storage_format=storage_format, space_optimisation=space_optimisation ) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_file(gist.files['simply.js'].content) send_td_event('cloudpebble_gist_import', data={'data': {'gist_id': gist_id}}, project=project) return project.id
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_keen_event('cloudpebble', 'cloudpebble_gist_not_found', user=user, data={'data': { 'gist_id': gist_id }}) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' project_type = 'native' if 'appinfo.json' in files: settings = json.loads(files['appinfo.json'].content) if 'projectType' in settings: project_type = settings['projectType'] elif len(files) == 2: if 'simply.js' in files: project_type = 'simplyjs' elif 'app.js' in files: project_type = 'pebblejs' else: settings = {} if len(files) == 1: if 'simply.js' in files: project_type = 'simplyjs' elif 'app.js' in files: project_type = 'pebblejs' project_settings = { 'name': settings.get('longName', default_name), 'owner': user, 'app_uuid': generate_half_uuid(), 'app_short_name': settings.get('shortName', default_name), 'app_long_name': settings.get('longName', default_name), 'app_company_name': settings.get('companyName', user.username), 'app_version_code': 1, 'app_version_label': settings.get('versionLabel', '1.0'), 'app_is_watchface': settings.get('watchapp', {}).get('watchface', False), 'app_capabilities': ','.join(settings.get('capabilities', [])), 'app_keys': dict_to_pretty_json(settings.get('appKeys', {})), 'project_type': project_type } with transaction.commit_on_success(): project = Project.objects.create(**project_settings) if project_type != 'simplyjs': for filename in gist.files: if (project_type == 'native' and filename.endswith('.c') or filename.endswith('.h')) or filename.endswith('.js'): # Because gists can't have subdirectories. if filename == 'pebble-js-app.js': cp_filename = 'js/pebble-js-app.js' else: cp_filename = filename source_file = SourceFile.objects.create( project=project, file_name=cp_filename) source_file.save_file(gist.files[filename].content) media = settings.get('resources', {}).get('media', []) resources = {} for resource in media: kind = resource['type'] def_name = resource['name'] filename = resource['file'] regex = resource.get('characterRegex', None) tracking = resource.get('trackingAdjust', None) is_menu_icon = resource.get('menuIcon', False) compatibility = resource.get('compatibility', None) if filename not in gist.files: continue if filename not in resources: resources[filename] = ResourceFile.objects.create( project=project, file_name=filename, kind=kind, is_menu_icon=is_menu_icon) # We already have this as a unicode string in .content, but it shouldn't have become unicode # in the first place. resources[filename].save_file( urllib2.urlopen(gist.files[filename].raw_url)) ResourceIdentifier.objects.create( resource_file=resources[filename], resource_id=def_name, character_regex=regex, tracking=tracking, compatibility=compatibility) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_file(gist.files['simply.js'].content) send_keen_event('cloudpebble', 'cloudpebble_gist_import', project=project, data={'data': { 'gist_id': gist_id }}) return project.id
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_td_event('cloudpebble_gist_not_found', data={'data': {'gist_id': gist_id}}, user=user) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' default_settings = { 'name': default_name, 'app_short_name': default_name, 'app_long_name': default_name, 'app_company_name': user.username, 'app_version_label': '1.0', 'app_is_watchface': False, 'app_is_hidden': False, 'app_is_shown_on_communication': False, 'app_capabilities': '[]', 'app_keys': '{}', 'project_type': 'native', 'app_modern_multi_js': False, 'sdk_version': '2' } if len(files) == 1 or ((APPINFO_MANIFEST in files or PACKAGE_MANIFEST in files) and len(files) == 2): if 'simply.js' in files: default_settings['project_type'] = 'simplyjs' elif 'app.js' in files: default_settings['project_type'] = 'pebblejs' elif 'index.js' in files: default_settings['project_type'] = 'rocky' # If all files are .js or .json and there is an index.js, assume it's a rocky project. if all(x.endswith(('.js', '.json')) for x in gist.files) and 'index.js' in files: default_settings['project_type'] = 'rocky' default_settings['sdk_version'] = '3' default_settings['app_modern_multi_js'] = True media = [] # Using defaultdict we can load project settings from a manifest dict which # has values that default to None. This way, we can delegate if PACKAGE_MANIFEST in files: content = json.loads(files[PACKAGE_MANIFEST].content) package = defaultdict(lambda: None) package.update(content) package['pebble'] = defaultdict(lambda: None) package['pebble'].update(content.get('pebble', {})) manifest_settings, media, dependencies = load_manifest_dict(package, PACKAGE_MANIFEST, default_project_type=None) default_settings['app_keys'] = '[]' default_settings['sdk_version'] = '3' default_settings['app_modern_multi_js'] = True elif APPINFO_MANIFEST in files: content = json.loads(files[APPINFO_MANIFEST].content) package = defaultdict(lambda: None) package.update(content) manifest_settings, media, dependencies = load_manifest_dict(package, APPINFO_MANIFEST, default_project_type=None) else: manifest_settings = {} dependencies = {} fixed_settings = { 'owner': user, 'app_uuid': generate_half_uuid() } project_settings = {} project_settings.update(default_settings) project_settings.update({k: v for k, v in manifest_settings.iteritems() if v is not None}) project_settings.update(fixed_settings) with transaction.atomic(): project = Project.objects.create(**project_settings) project.set_dependencies(dependencies) project_type = project.project_type if project_type == 'package': raise Exception("Gist imports are not yet support for packages.") if project_type != 'simplyjs': for filename in gist.files: target = 'app' if not filename.endswith(('.c', '.h', '.js', '.json')): continue if filename in ('appinfo.json', 'package.json'): continue if project_type == 'native': if filename.endswith(('.js', '.json')): target = 'pkjs' elif project_type == 'rocky': if filename == 'app.js': target = 'pkjs' source_file = SourceFile.objects.create(project=project, file_name=filename, target=target) source_file.save_text(gist.files[filename].content) resources = {} for resource in media: kind = resource['type'] def_name = resource['name'] filename = resource['file'] regex = resource.get('characterRegex', None) tracking = resource.get('trackingAdjust', None) memory_format = resource.get('memoryFormat', None) storage_format = resource.get('storageFormat', None) space_optimisation = resource.get('spaceOptimization', None) is_menu_icon = resource.get('menuIcon', False) compatibility = resource.get('compatibility', None) if filename not in gist.files: continue if filename not in resources: resources[filename] = ResourceFile.objects.create(project=project, file_name=filename, kind=kind, is_menu_icon=is_menu_icon) # We already have this as a unicode string in .content, but it shouldn't have become unicode # in the first place. default_variant = ResourceVariant.objects.create(resource_file=resources[filename], tags=ResourceVariant.TAGS_DEFAULT) default_variant.save_file(urllib2.urlopen(gist.files[filename].raw_url)) ResourceIdentifier.objects.create( resource_file=resources[filename], resource_id=def_name, character_regex=regex, tracking=tracking, compatibility=compatibility, memory_format=memory_format, storage_format=storage_format, space_optimisation=space_optimisation ) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_text(gist.files['simply.js'].content) send_td_event('cloudpebble_gist_import', data={'data': {'gist_id': gist_id}}, project=project) return project.id
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_keen_event('cloudpebble', 'cloudpebble_gist_not_found', user=user, data={'data': {'gist_id': gist_id}}) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' project_type = 'native' if 'appinfo.json' in files: settings = json.loads(files['appinfo.json'].content) if 'projectType' in settings: project_type = settings['projectType'] elif len(files) == 2: if 'simply.js' in files: project_type = 'simplyjs' elif 'app.js' in files: project_type = 'pebblejs' else: settings = {} if len(files) == 1: if 'simply.js' in files: project_type = 'simplyjs' elif 'app.js' in files: project_type = 'pebblejs' project_settings = { 'name': settings.get('longName', default_name), 'owner': user, 'app_uuid': generate_half_uuid(), 'app_short_name': settings.get('shortName', default_name), 'app_long_name': settings.get('longName', default_name), 'app_company_name': settings.get('companyName', user.username), 'app_version_label': settings.get('versionLabel', '1.0'), 'app_is_watchface': settings.get('watchapp', {}).get('watchface', False), 'app_is_hidden': settings.get('watchapp', {}).get('hiddenApp', False), 'app_is_shown_on_communication': settings.get('watchapp', {}).get('onlyShownOnCommunication', False), 'app_capabilities': ','.join(settings.get('capabilities', [])), 'app_keys': dict_to_pretty_json(settings.get('appKeys', {})), 'project_type': project_type, 'sdk_version': settings.get('sdkVersion', '2'), } with transaction.atomic(): project = Project.objects.create(**project_settings) if project_type != 'simplyjs': for filename in gist.files: if (project_type == 'native' and filename.endswith('.c') or filename.endswith('.h')) or filename.endswith('.js'): # Because gists can't have subdirectories. if filename == 'pebble-js-app.js': cp_filename = 'js/pebble-js-app.js' else: cp_filename = filename source_file = SourceFile.objects.create(project=project, file_name=cp_filename) source_file.save_file(gist.files[filename].content) media = settings.get('resources', {}).get('media', []) resources = {} for resource in media: kind = resource['type'] def_name = resource['name'] filename = resource['file'] regex = resource.get('characterRegex', None) tracking = resource.get('trackingAdjust', None) memory_format = resource.get('memoryFormat', None) storage_format = resource.get('storageFormat', None) space_optimisation = resource.get('spaceOptimization', None) is_menu_icon = resource.get('menuIcon', False) compatibility = resource.get('compatibility', None) if filename not in gist.files: continue if filename not in resources: resources[filename] = ResourceFile.objects.create(project=project, file_name=filename, kind=kind, is_menu_icon=is_menu_icon) # We already have this as a unicode string in .content, but it shouldn't have become unicode # in the first place. default_variant = ResourceVariant.objects.create(resource_file=resources[filename], tags=ResourceVariant.TAGS_DEFAULT) default_variant.save_file(urllib2.urlopen(gist.files[filename].raw_url)) ResourceIdentifier.objects.create( resource_file=resources[filename], resource_id=def_name, character_regex=regex, tracking=tracking, compatibility=compatibility, memory_format=memory_format, storage_format=storage_format, space_optimisation=space_optimisation ) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_file(gist.files['simply.js'].content) send_keen_event('cloudpebble', 'cloudpebble_gist_import', project=project, data={'data': {'gist_id': gist_id}}) return project.id
def import_gist(user_id, gist_id): user = User.objects.get(pk=user_id) g = github.Github() try: gist = g.get_gist(gist_id) except github.UnknownObjectException: send_keen_event('cloudpebble', 'cloudpebble_gist_not_found', user=user, data={'data': { 'gist_id': gist_id }}) raise Exception("Couldn't find gist to import.") files = gist.files default_name = gist.description or 'Sample project' is_native = True if 'appinfo.json' in files: settings = json.loads(files['appinfo.json'].content) if len(files) == 2 and 'simply.js' in files: is_native = False else: settings = {} if len(files) == 1 and 'simply.js' in files: is_native = False project_settings = { 'name': settings.get('longName', default_name), 'owner': user, 'sdk_version': 2, 'app_uuid': generate_half_uuid(), 'app_short_name': settings.get('shortName', default_name), 'app_long_name': settings.get('longName', default_name), 'app_company_name': settings.get('companyName', user.username), 'app_version_code': 1, 'app_version_label': settings.get('versionLabel', '1.0'), 'app_is_watchface': settings.get('watchapp', {}).get('watchface', False), 'app_capabilities': ','.join(settings.get('capabilities', [])), 'app_keys': dict_to_pretty_json(settings.get('appKeys', {})), 'project_type': 'native' if is_native else 'simplyjs' } with transaction.commit_on_success(): project = Project.objects.create(**project_settings) if is_native: for filename in gist.files: if filename.endswith('.c') or filename.endswith( '.h') or filename == 'pebble-js-app.js': # Because gists can't have subdirectories. if filename == 'pebble-js-app.js': cp_filename = 'js/pebble-js-app.js' else: cp_filename = filename source_file = SourceFile.objects.create( project=project, file_name=cp_filename) source_file.save_file(gist.files[filename].content) else: source_file = SourceFile.objects.create(project=project, file_name='app.js') source_file.save_file(gist.files['simply.js'].content) send_keen_event('cloudpebble', 'cloudpebble_gist_import', project=project, data={'data': { 'gist_id': gist_id }}) return project.id