def migrate_file(old_file, new_user, source, source_id): if old_file.file_type not in FILE_KINDS_MAPPING[source]: return updated_at = strip_timezone(old_file.updated_at.replace(tzinfo=eet)) \ if old_file.updated_at else datetime.utcnow() new_file = ApellaFile( id=get_serial('apella_file'), owner=new_user, description=old_file.file_description, file_kind=FILE_KINDS_MAPPING[source][old_file.file_type], source=source, source_id=source_id, updated_at=updated_at, file_name=old_file.original_name) new_file_path = safe_path_join( settings.MEDIA_ROOT, generate_filename(new_file, old_file.original_name)) new_file.file_content = new_file_path new_file.old_file_path = old_file.file_path new_file.save() field_name, many = \ FILE_KIND_TO_FIELD[FILE_KINDS_MAPPING[source][old_file.file_type]].\ values() if source == 'profile': if new_user.is_professor(): set_attr_files(new_user.professor, field_name, many, new_file) elif new_user.is_candidate(): set_attr_files(new_user.candidate, field_name, many, new_file) elif source == 'candidacy': candidacy = Candidacy.objects.get(id=source_id) set_attr_files(candidacy, field_name, many, new_file)
def validate_old_file_permissions(): euid = os.geteuid() newroot = settings.MEDIA_ROOT oldroot = settings.OLD_APELLA_MEDIA_ROOT dircount = 0 filecount = 0 for dirpath, dirnames, filenames in os.walk(oldroot): dircount += 1 for filename in filenames: filecount += 1 if filecount & 1023 == 0: m = "Validated %d old files so far" % filecount logger.info(m) path = safe_path_join(dirpath, filename) owner = os.stat(path).st_uid if owner != euid: m = ("{path!r}: owner {owner!r} is not the same as " "the running euid {euid!r}. " "Hard linking from {oldroot!r} to {newroot!r} will fail.") m = m.format(path=path, owner=owner, euid=euid, oldroot=oldroot, newroot=newroot) logger.error(m) raise RuntimeError(m) m = ("{path!r}: validated {filecount!r} old files " "in {dircount!r} directories") m = m.format(path=oldroot, filecount=filecount, dircount=dircount) logger.info(m)
def validate_new_file_permissions(): newroot = settings.MEDIA_ROOT dircount = 0 filecount = 0 for dirpath, dirnames, filenames in os.walk(newroot): dircount += 1 write_test_path = safe_path_join(dirpath, '..write_test') try: with open(write_test_path, "w"): try: os.unlink(write_test_path) except Exception as e: logger.error(e) except Exception as e: m = "{path!r}: cannot write in directory: {e!r}" m = m.format(path=dirpath, e=e) logger.error(m) raise RuntimeError(m) for filename in filenames: filecount += 1 if filecount & 1023 == 0: m = "Validated %d new files so far" % filecount logger.info(m) read_test_path = safe_path_join(dirpath, filename) try: with open(read_test_path, "r"): pass except Exception as e: m = "{path!r}: cannot open file for reading: {e!r}" m = m.format(path=read_test_path, e=e) logger.error(m) raise RuntimeError(m) m = ("{path!r}: validated {filecount!r} new files " "in {dircount!r} directories") m = m.format(path=newroot, filecount=filecount, dircount=dircount) logger.info(m)
def destroy(self, request, pk=None): obj = self.get_object() try: f = safe_path_join(settings.MEDIA_ROOT, obj.file_content.name) os.remove(f) logger.info( 'user %s removed file: %s, path: %s source: %s, source_id: %s' % ( request.user.username, obj.file_name, obj.file_content.path, obj.source, obj.source_id, )) except OSError: pass return super(FilesViewSet, self).destroy(request, pk)
def link_single_file(existing_file, dest_obj, source='candidacy'): new_file = ApellaFile(id=get_serial('apella_file'), owner=existing_file.owner, source=source, file_kind=existing_file.file_kind, source_id=dest_obj.id, description=existing_file.description, updated_at=datetime.utcnow(), file_name=existing_file.file_name) new_name = generate_filename(new_file, new_file.file_name) new_path = safe_path_join(settings.MEDIA_ROOT, new_name) existing_path = existing_file.file_content.path try: os.link(existing_path, new_path) except OSError as e: logger.error('failed to link %s file: %s' % (e, source)) raise new_file.file_content = new_path new_file.save() return new_file
def load_holidays(): with open(safe_path_join(settings.RESOURCES_DIR, 'holidays.json')) \ as json_file: return json.load(json_file)
def load_resources(): with open(safe_path_join(settings.RESOURCES_DIR, 'common.json')) \ as json_file: return json.load(json_file)