<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
import peewee


class MalwareScan(peewee.Model):
    class Meta:
        db_table = "malware_scans"

    scanid = peewee.CharField(primary_key=True)


class MalwareHit(peewee.Model):
    class Meta:
        db_table = "malware_hits"

    id = peewee.PrimaryKeyField()
    scanid = peewee.ForeignKeyField(
        MalwareScan, null=False, related_name="hits", on_delete="CASCADE"
    )
    user = peewee.CharField(null=False)
    orig_file = peewee.BlobField(null=False)
    type = peewee.CharField(null=False)
    malicious = peewee.BooleanField(null=False, default=False)
    vendor = peewee.CharField(null=False, default="ai-bolit")
    hash = peewee.CharField(null=True)
    size = peewee.CharField(null=True)
    timestamp = peewee.FloatField(null=True)
    status = peewee.CharField(default="found")
    cleaned_at = peewee.FloatField(null=True)

    @classmethod
    def get_field_names(cls):
        return map(lambda field: field.column_name, cls._meta.sorted_fields)


def migrate(migrator, database, fake=False, **kwargs):
    migrator.sql("ALTER TABLE malware_hits RENAME TO malware_hits_old;")
    migrator.create_model(MalwareHit)
    # specify fields order directly, because '*' doesnt guarantee order
    malware_hit_fields = ",".join(MalwareHit.get_field_names())
    migrator.sql(
        "INSERT INTO malware_hits ({0}) SELECT {0} FROM malware_hits_old;"
        .format(malware_hit_fields)
    )
    migrator.sql("DROP TABLE malware_hits_old;")


def rollback(migrator, database, fake=False, **kwargs):
    pass
