Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
 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)
Beispiel #5
0
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
Beispiel #6
0
def load_holidays():
    with open(safe_path_join(settings.RESOURCES_DIR, 'holidays.json')) \
            as json_file:
        return json.load(json_file)
Beispiel #7
0
def load_resources():
    with open(safe_path_join(settings.RESOURCES_DIR, 'common.json')) \
            as json_file:
        return json.load(json_file)