Fakultas Ilmu Komputer UI

validators.py 1.98 KB
Newer Older
1
import os
2
import math
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.core.exceptions import ValidationError
from kape.settings import MAX_UPLOAD_SIZE


def validate_file(value, valid_extensions):
    ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
    if not ext.lower() in valid_extensions:
        raise ValidationError(u'Unsupported file extension.')

    if value._size > MAX_UPLOAD_SIZE:
        raise ValidationError(u'File too large.')


def validate_document_file_extension(value):
    validate_file(value, ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls'])


def validate_image_file_extension(value):
    validate_file(value, ['.jpeg', '.jpg', '.png', '.JPG', '.JPEG'])
22

Aldo Bima Syahputra's avatar
Aldo Bima Syahputra committed
23
24
25
def validate_student_gpa(value):
    if (value<0 or value>4):
        raise ValidationError(u"GPA harus merupakan angka antara 0-4")
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

def validate_npm(value):
    '''
        NPM UI terdiri dari 10 digit, misalnya: 1234567894. Digit terakhir
        (disebut checksum) dapat dihitung dari sembilan digit pertama.
        Checksum dipakai untuk deteksi error pada nomor ID seperti NPM.
        Digit-digit tersebut diberi indeks: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
        sesuai posisinya. Kita asosiasikan digit-digit tersebut dengan
        variabel-variabel d[0], d[1], d[2] , ..., d[9].
        Checksum C (yaitu d[9]) dihitung dengan rumus sebagai berikut:
        1)      a = 3* (d[0] + d[2] + d[4] + d[6] + d[8])
        2)      b = (d[1] + d[3] + d[5] + d[7])
        3)      C = (a + b) % 7

        Sebagai contoh, checksum untuk NPM 1234567894  adalah
        C = (3*(1 + 3 + 5 + 7 + 9) + (2 + 4 + 6 + 8)) % 7 = 95 % 7 = 4
        yang memang ternyata benar.

        Source: Lim Yohanes Stefanus, Drs., M.Math., Ph.D
    '''
    if math.ceil(math.log(value+1, 10)) != 10:
        raise ValidationError(u"NPM must be 10 digits")
    val_string = str(value)
    if sum([3*int(a) for a in val_string[:-1:2]]+[int(a) for a in val_string[1:-1:2]]) % 7 != int(val_string[-1]):
Metta Anantha Pindika's avatar
Metta Anantha Pindika committed
50
        raise ValidationError(u"NPM {} has invalid checksum".format(value))