VioletWizard commited on
Commit
ab5de74
·
unverified ·
1 Parent(s): c5bc3f7

Update validators.py

Browse files
Files changed (1) hide show
  1. validators.py +91 -0
validators.py CHANGED
@@ -41,3 +41,94 @@ def with_fallback_author_role(df):
41
  fixed.loc[(fixed["author_role"] == "") & teacher_name_hint, "author_role"] = "교사"
42
  fixed.loc[fixed["author_role"] == "", "author_role"] = "학생"
43
  return fixed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  fixed.loc[(fixed["author_role"] == "") & teacher_name_hint, "author_role"] = "교사"
42
  fixed.loc[fixed["author_role"] == "", "author_role"] = "학생"
43
  return fixed
44
+
45
+
46
+
47
+ ALLOWED_TEXT_PATTERN = re.compile(r"^[0-9A-Za-z가-힣ㄱ-ㅎㅏ-ㅣ _.,!?():;@#&/\-]*$")
48
+
49
+
50
+ def _contains_forbidden_word(text, forbidden_words=None):
51
+ words = forbidden_words or []
52
+ lowered = str(text or "").lower()
53
+ for word in words:
54
+ if str(word).lower() in lowered:
55
+ return True
56
+ return False
57
+
58
+
59
+ def _validate_text_field(
60
+ raw_text,
61
+ *,
62
+ field_name,
63
+ max_len,
64
+ allow_empty=False,
65
+ forbidden_words=None,
66
+ allowed_pattern=ALLOWED_TEXT_PATTERN,
67
+ ):
68
+ normalized = normalize_user_text(raw_text, max_len=max_len)
69
+ if not normalized:
70
+ if allow_empty:
71
+ return True, "", None, None
72
+ return False, "", "VALIDATION_EMPTY", f"{field_name}을(를) 입력해 주세요."
73
+
74
+ if len(normalized) > max_len:
75
+ return False, "", "VALIDATION_TOO_LONG", f"{field_name}은(는) {max_len}자 이하여야 합니다."
76
+
77
+ if allowed_pattern and not allowed_pattern.match(normalized):
78
+ return False, "", "VALIDATION_INVALID_CHARS", f"{field_name}에 허용되지 않은 문자가 포함되어 있습니다."
79
+
80
+ if _contains_forbidden_word(normalized, forbidden_words=forbidden_words):
81
+ return False, "", "VALIDATION_FORBIDDEN", f"{field_name}에 사용할 수 없는 단어가 포함되어 있습니다."
82
+
83
+ return True, normalized, None, None
84
+
85
+
86
+ def validate_room_name(raw_text, max_len=60):
87
+ collapsed = normalize_room_name(raw_text, max_len=max_len)
88
+ return _validate_text_field(
89
+ collapsed,
90
+ field_name="방 이름",
91
+ max_len=max_len,
92
+ allow_empty=False,
93
+ forbidden_words=["관리자", "운영자"],
94
+ )
95
+
96
+
97
+ def validate_student_name(raw_text, max_len=30):
98
+ return _validate_text_field(
99
+ raw_text,
100
+ field_name="학생 이름/학번",
101
+ max_len=max_len,
102
+ allow_empty=False,
103
+ forbidden_words=["관리자", "운영자", "admin"],
104
+ )
105
+
106
+
107
+ def validate_opinion_content(raw_text, max_len=700):
108
+ return _validate_text_field(
109
+ raw_text,
110
+ field_name="의견 내용",
111
+ max_len=max_len,
112
+ allow_empty=False,
113
+ )
114
+
115
+
116
+ def validate_entry_code(raw_text, max_len=60):
117
+ return _validate_text_field(
118
+ raw_text,
119
+ field_name="입장 암호",
120
+ max_len=max_len,
121
+ allow_empty=True,
122
+ allowed_pattern=re.compile(r"^[0-9A-Za-z가-힣ㄱ-ㅎㅏ-ㅣ _!@#$%^&*()+=.?/:;\-]*$"),
123
+ )
124
+
125
+
126
+ def validate_teacher_credential(raw_text, *, field_name, max_len=60):
127
+ return _validate_text_field(
128
+ raw_text,
129
+ field_name=field_name,
130
+ max_len=max_len,
131
+ allow_empty=False,
132
+ forbidden_words=[" "],
133
+ allowed_pattern=re.compile(r"^[0-9A-Za-z_.@\-]+$"),
134
+ )