def generate_packaged_app(namedict, apptype, categories, developer_name, privacy_policy=None, device_types=(), permissions=(), versions=(), default_locale='en-US', package_file=None, status=4, **kw): now = datetime.datetime.now() app = app_factory(categories=categories, name=namedict[default_locale], complete=False, rated=True, is_packaged=True, privacy_policy=privacy_policy, version_kw={ 'version': '1.0', 'reviewed': now if status >= 4 else None, '_developer_name': developer_name}, file_kw={'status': status}) if device_types: for dt in device_types: app.addondevicetype_set.create(device_type=DEVICE_CHOICES_IDS[dt]) else: app.addondevicetype_set.create(device_type=1) f = app.latest_version.all_files[0] f.update(filename=f.generate_filename()) fp = os.path.join(app.latest_version.path_prefix, f.filename) if package_file: package_file_file = open(package_file) manifest = WebAppParser().get_json_data(package_file_file) AppManifest.objects.create( version=app.latest_version, manifest=json.dumps(manifest)) # copy package_file to storage like a normal app. private_storage.save(fp, package_file_file) app.update_version() return app with private_storage.open(fp, 'w') as out: generate_app_package(app, out, apptype, permissions, namedict, version=app.latest_version) for i, vspec in enumerate(versions, 1): st = STATUS_CHOICES_API_LOOKUP[vspec.get("status", "public")] rtime = (now + datetime.timedelta(i)) v = version_factory(version="1." + str(i), addon=app, reviewed=rtime if st >= 4 else None, nomination=rtime if st > 0 else None, created=rtime, file_kw={'status': st}, _developer_name=developer_name) f = v.files.all()[0] f.update(filename=f.generate_filename()) fp = os.path.join(app.latest_version.path_prefix, f.filename) with private_storage.open(fp, 'w') as out: generate_app_package(app, out, vspec.get("type", apptype), vspec.get("permissions", permissions), namedict, version=v) app.update_version() return app
def newfile(self, name, contents): src = self.path(name) private_storage.save(src, ContentFile(contents)) return src
def test_storage_walk(): tmp = tempfile.mkdtemp() jn = partial(os.path.join, tmp) try: private_storage.save(jn('file1.txt'), ContentFile('')) private_storage.save(jn('one/file1.txt'), ContentFile('')) private_storage.save(jn('one/file2.txt'), ContentFile('')) private_storage.save(jn('one/two/file1.txt'), ContentFile('')) private_storage.save(jn('one/three/file1.txt'), ContentFile('')) private_storage.save(jn('four/five/file1.txt'), ContentFile('')) private_storage.save(jn(u'four/kristi\u2603/kristi\u2603.txt'), ContentFile('')) results = [(dir, set(subdirs), set(files)) for dir, subdirs, files in sorted(walk_storage(tmp, storage=private_storage))] yield (eq_, results.pop(0), (tmp, set(['four', 'one']), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('four'), set(['five', 'kristi\xe2\x98\x83']), set([]))) yield (eq_, results.pop(0), (jn('four/five'), set([]), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('four/kristi\xe2\x98\x83'), set([]), set(['kristi\xe2\x98\x83.txt']))) yield (eq_, results.pop(0), (jn('one'), set(['three', 'two']), set(['file1.txt', 'file2.txt']))) yield (eq_, results.pop(0), (jn('one/three'), set([]), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('one/two'), set([]), set(['file1.txt']))) yield (eq_, len(results), 0) finally: rm_local_tmp_dir(tmp)
def test_storage_walk(): tmp = tempfile.mkdtemp() jn = partial(os.path.join, tmp) try: private_storage.save(jn('file1.txt'), ContentFile('')) private_storage.save(jn('one/file1.txt'), ContentFile('')) private_storage.save(jn('one/file2.txt'), ContentFile('')) private_storage.save(jn('one/two/file1.txt'), ContentFile('')) private_storage.save(jn('one/three/file1.txt'), ContentFile('')) private_storage.save(jn('four/five/file1.txt'), ContentFile('')) private_storage.save(jn(u'four/kristi\u2603/kristi\u2603.txt'), ContentFile('')) results = [(dir, set(subdirs), set(files)) for dir, subdirs, files in sorted( walk_storage(tmp, storage=private_storage))] yield (eq_, results.pop(0), (tmp, set(['four', 'one']), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('four'), set(['five', 'kristi\xe2\x98\x83']), set([]))) yield (eq_, results.pop(0), (jn('four/five'), set([]), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('four/kristi\xe2\x98\x83'), set([]), set(['kristi\xe2\x98\x83.txt']))) yield (eq_, results.pop(0), (jn('one'), set(['three', 'two']), set(['file1.txt', 'file2.txt']))) yield (eq_, results.pop(0), (jn('one/three'), set([]), set(['file1.txt']))) yield (eq_, results.pop(0), (jn('one/two'), set([]), set(['file1.txt' ]))) yield (eq_, len(results), 0) finally: rm_local_tmp_dir(tmp)
def _save_attachment(attachment, filepath): """Saves an attachment and returns the filename.""" filepath = private_storage.save(filepath, attachment) # In case of duplicate filename, storage suffixes filename. return filepath.split('/')[-1]