def load_app_from_slug(domain, username, slug): # Import app itself template = load_app_template(slug) app = import_app_util(template, domain, { 'created_from_template': '%s' % slug, }) # Fetch multimedia, which is hosted elsewhere multimedia_filename = os.path.join(app_template_dir(slug), 'multimedia.json') if (os.path.exists(multimedia_filename)): with open(multimedia_filename) as f: path_url_map = json.load(f) http = urllib3.PoolManager() for path, url in path_url_map.items(): try: req = http.request('GET', url) except Exception: # If anything goes wrong, just bail. It's not a big deal if a template app is missing a file. continue if req.status == 200: data = req.data media_class = CommCareMultimedia.get_class_by_data(data) if media_class: multimedia = media_class.get_by_data(data) multimedia.attach_data(data, original_filename=os.path.basename(path), username=username) multimedia.add_domain(domain, owner=True) app.create_mapping(multimedia, MULTIMEDIA_PREFIX + path) comment = _("A sample application you can try out in Web Apps") build = make_async_build(app, username, allow_prune=False, comment=comment) build.is_released = True build.save(increment_version=False) return build
def app_from_template(request, domain, slug): send_hubspot_form(HUBSPOT_APP_TEMPLATE_FORM_ID, request) clear_app_cache(request, domain) template = load_app_template(slug) app = import_app_util(template, domain, { 'created_from_template': '%s' % slug, }) for path in get_template_app_multimedia_paths(slug): media_class = None with open(os.path.join(app_template_dir(slug), path), "rb") as f: f.seek(0) data = f.read() media_class = CommCareMultimedia.get_class_by_data(data) if media_class: multimedia = media_class.get_by_data(data) multimedia.attach_data( data, original_filename=os.path.basename(path), username=request.user.username) multimedia.add_domain(domain, owner=True) app.create_mapping(multimedia, MULTIMEDIA_PREFIX + path) comment = _("A sample application you can try out in Web Apps") build = make_async_build(app, request.user.username, release=True, comment=comment) cloudcare_state = '{{"appId":"{}"}}'.format(build._id) return HttpResponseRedirect( reverse(FormplayerMain.urlname, args=[domain]) + '#' + cloudcare_state)
def test_prune_autogenerated_builds(self): kafka_seq = get_topic_offset(topics.APP) couch_seq = get_current_seq(Application.get_db()) # Build #1, manually generated app = self._create_app('test-prune-app') build1 = app.make_build() build1.save() self.assertFalse(build1.is_auto_generated) # Build #2, auto-generated app.save() build2 = make_async_build(app, 'someone') # Build #3, manually generated app.save() build3 = app.make_build() build3.save() # All 3 builds should show up in ES self.refresh_elasticsearch(kafka_seq, couch_seq) build_ids_in_es = AppES().domain(self.domain).is_build().values_list('_id', flat=True) self.assertItemsEqual(build_ids_in_es, [build1._id, build2._id, build3._id]) # prune, which should delete the autogenerated build prune_auto_generated_builds(self.domain, app.id) # Build2 should no longer be in ES self.refresh_elasticsearch(kafka_seq, couch_seq) build_ids_in_es = AppES().domain(self.domain).is_build().values_list('_id', flat=True) self.assertItemsEqual(build_ids_in_es, [build1._id, build3._id])
def testPruneAutoGeneratedBuilds(self, mock): # Build #1, manually generated app = import_app(self._yesno_source, self.domain) for module in app.modules: module.get_or_create_unique_id() app.save() build1 = app.make_build() build1.save() self.assertFalse(build1.is_auto_generated) # Build #2, auto-generated app.save() make_async_build(app, 'someone') build_ids = get_built_app_ids_for_app_id(app.domain, app.id) self.assertEqual(len(build_ids), 2) self.assertEqual(build_ids[0], build1.id) build2 = get_app(app.domain, build_ids[1]) self.assertTrue(build2.is_auto_generated) # First prune: delete nothing because the auto build is the most recent prune_auto_generated_builds(self.domain, app.id) self.assertEqual(len(get_built_app_ids_for_app_id(app.domain, app.id)), 2) # Build #3, manually generated app.save() build3 = app.make_build() build3.save() # Release the auto-generated build and prune again, should still delete nothing build2.is_released = True build2.save() prune_auto_generated_builds(self.domain, app.id) self.assertEqual(len(get_built_app_ids_for_app_id(app.domain, app.id)), 3) # Un-release the auto-generated build and prune again, which should delete it build2.is_released = False build2.save() prune_auto_generated_builds(self.domain, app.id) build_ids = get_built_app_ids_for_app_id(app.domain, app.id) self.assertEqual(len(build_ids), 2) self.assertNotIn(build2.id, build_ids)