Skip to content

Commit 690dc29

Browse files
committed
a bit more profanity checking work
1 parent 11ab8ed commit 690dc29

File tree

10 files changed

+49
-28
lines changed

10 files changed

+49
-28
lines changed

todoqueue_backend/accounts/serializers.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
from django.contrib.auth import get_user_model
22
from rest_framework import serializers
3-
from rest_framework.validators import UniqueValidator
3+
from rest_framework.validators import UniqueValidator, ValidationError
44

5+
from profanity_check import predict as is_profane
56
from logging import getLogger
67

78
logger = getLogger(__name__)
89

910

11+
def validate_profanity(value):
12+
logger.info("Validating profanity")
13+
if is_profane([value])[0] == 1:
14+
raise ValidationError("Profanity is not allowed")
15+
16+
1017
class CustomUserSerializer(serializers.ModelSerializer):
1118
class Meta:
1219
model = get_user_model()
@@ -29,10 +36,10 @@ class Meta(CustomUserSerializer.Meta):
2936

3037
class CustomUserRegistrationSerializer(serializers.ModelSerializer):
3138
email = serializers.EmailField(
32-
validators=[UniqueValidator(queryset=get_user_model().objects.all())]
39+
validators=[UniqueValidator(queryset=get_user_model().objects.all()), validate_profanity]
3340
)
3441
username = serializers.CharField(
35-
validators=[UniqueValidator(queryset=get_user_model().objects.all())]
42+
validators=[UniqueValidator(queryset=get_user_model().objects.all()), validate_profanity]
3643
)
3744
password = serializers.CharField(write_only=True)
3845

todoqueue_backend/accounts/views.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from logging import getLogger
22
from time import sleep
3-
from profanity_check import predict as is_profane
43

54
from django.contrib.auth import get_user_model
65
from django.contrib.auth.tokens import default_token_generator
@@ -30,11 +29,6 @@
3029
user_model = get_user_model()
3130

3231

33-
def validate_profanity(value):
34-
logger.info("Validating profanity")
35-
return is_profane([value])[0] == 1
36-
37-
3832
class CustomUserViewSet(viewsets.ModelViewSet):
3933
queryset = user_model.objects.all().order_by("-date_joined")
4034
serializer_class = CustomUserSerializer
@@ -84,12 +78,6 @@ def post(self, request):
8478
logger.info(f"Registering user with email: {request.data['email']}")
8579
serializer = CustomUserRegistrationSerializer(data=request.data)
8680

87-
if validate_profanity(request.data["username"]):
88-
return Response(
89-
{"detail": "Username contains profanity."},
90-
status=status.HTTP_400_BAD_REQUEST,
91-
)
92-
9381
# If the user already exists, and is not activated, then delete the user and create a new one
9482
try:
9583
user = user_model.objects.get(email=request.data["email"])

todoqueue_backend/tasks/models.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import croniter
66
from profanity_check import predict as is_profane
7+
from profanity_check import predict_prob as how_profane
78

89
from django.conf import settings
910
from django.contrib.auth import get_user_model
@@ -24,8 +25,11 @@
2425

2526

2627
def validate_profanity(value):
28+
logger.debug(f"Validating profanity for value: {value}")
2729
if is_profane([value])[0] == 1:
30+
logger.debug("Profanity detected!")
2831
raise ValidationError("Profanity is not allowed")
32+
logger.debug(f"Value {value} is OK - profanity score: {how_profane([value])[0]}")
2933

3034

3135
class Household(models.Model):
@@ -332,7 +336,7 @@ class ScheduledTaskSerializer(serializers.ModelSerializer):
332336
next_due = serializers.SerializerMethodField()
333337
last_due = serializers.SerializerMethodField()
334338
mean_completion_time = serializers.SerializerMethodField()
335-
description = serializers.CharField(required=False, allow_blank=True)
339+
description = serializers.CharField(required=False, allow_blank=True, validators=[validate_profanity])
336340

337341
class Meta:
338342
model = ScheduledTask
@@ -354,7 +358,7 @@ def get_mean_completion_time(self, obj):
354358
class FlexibleTaskSerializer(serializers.ModelSerializer):
355359
staleness = serializers.SerializerMethodField()
356360
mean_completion_time = serializers.SerializerMethodField()
357-
description = serializers.CharField(required=False, allow_blank=True)
361+
description = serializers.CharField(required=False, allow_blank=True, validators=[validate_profanity])
358362

359363
class Meta:
360364
model = FlexibleTask
@@ -484,7 +488,7 @@ class Meta:
484488

485489
class CreateHouseholdSerializer(serializers.ModelSerializer):
486490
name = serializers.CharField(
487-
max_length=255, validators=[UniqueValidator(queryset=Household.objects.all())]
491+
max_length=255, validators=[UniqueValidator(queryset=Household.objects.all()), validate_profanity]
488492
)
489493

490494
class Meta:

todoqueue_backend/tasks/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
get_task_by_id,
3838
)
3939

40-
from .utils import bp_function, parse_duration, is_profane
40+
from .utils import bp_function, parse_duration
4141

4242
logger = getLogger(__name__)
4343
basicConfig(level=INFO)

todoqueue_backend/todoqueue_backend/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from logging import getLogger, INFO, DEBUG, basicConfig
1919

20-
basicConfig(level=INFO)
20+
basicConfig(level=DEBUG)
2121
logger = getLogger(__name__)
2222

2323

todoqueue_frontend/src/api/households.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const createHousehold = async (name) => {
4545

4646
if (res.status !== 201) {
4747
console.log("Failed to create household.");
48-
return { error: "Failed to create household." };
48+
return { error: res.data.name };
4949
}
5050
return { success: "Successfully created household." };
5151

todoqueue_frontend/src/api/tasks.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,10 @@ export const createFlexibleTask = async (
251251

252252
if (res.status !== 201) {
253253
console.log("Failed to create task.");
254-
return;
254+
return res;
255255
}
256256

257-
return res.data;
257+
return res;
258258
};
259259

260260
export const updateFlexibleTask = async (

todoqueue_frontend/src/api/users.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export const signUp = async (email, username, password) => {
192192
}
193193
else {
194194
console.log("The registration response contains an error:", res);
195-
return {"error": res.data.detail};
195+
return {"error": res.data};
196196
}
197197

198198
} catch (error) {

todoqueue_frontend/src/components/popups/CreateFlexibleTaskPopup.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,20 @@ const CreateFlexibleTaskPopup = React.forwardRef((props, ref) => {
6868
const max_interval = `${newTask.max_interval_days || 0} ${newTask.max_interval_hours || 0}:${newTask.max_interval_minutes || 0}:00`;
6969
const min_interval = `${newTask.min_interval_days || 0} ${newTask.min_interval_hours || 0}:${newTask.min_interval_minutes || 0}:00`;
7070

71-
const response_data = await createFlexibleTask(
71+
const response = await createFlexibleTask(
7272
newTask.task_name,
7373
props.selectedHousehold,
7474
max_interval,
7575
min_interval,
7676
newTask.description,
7777
);
78+
if (response.status !== 201) {
79+
console.error("Error creating task. Response:", response.data);
80+
setInputError(true);
81+
return;
82+
}
7883

79-
console.log("Created task. Response:", response_data);
84+
console.log("Created task. Response:", response.data);
8085
await props.fetchSetTasks();
8186
props.closeCurrentPopup();
8287

@@ -144,7 +149,13 @@ const CreateFlexibleTaskPopup = React.forwardRef((props, ref) => {
144149
<h2>Create a New Task</h2>
145150
<form className="task-form">
146151
<div className="task-input-group">
147-
<input type="text" name="task_name" placeholder="Task Name" onChange={handleCreateInputChange} />
152+
<input
153+
className={inputError ? "input-error" : ""}
154+
type="text"
155+
name="task_name"
156+
placeholder="Task Name"
157+
onChange={handleCreateInputChange}
158+
/>
148159
</div>
149160

150161
<div className="task-input-group task-input-group-horizontal">
@@ -203,6 +214,7 @@ const CreateFlexibleTaskPopup = React.forwardRef((props, ref) => {
203214
</div>
204215
<div className="task-input-group">
205216
<input
217+
className={inputError ? "input-error" : ""}
206218
type="text"
207219
name="description"
208220
placeholder="Description"

todoqueue_frontend/src/components/signup.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ export const SignUp = ({ setShowHouseholdSelector }) => {
1616
setShowHouseholdSelector(false);
1717
}, []);
1818

19+
function getFirstErrorMessage(response) {
20+
for (let key in response) {
21+
if (response[key] instanceof Array && response[key].length > 0) {
22+
return response[key][0];
23+
}
24+
}
25+
return "Error during signup"; // Default error message
26+
}
27+
1928
const submit = async e => {
2029
e.preventDefault();
2130

@@ -28,7 +37,8 @@ export const SignUp = ({ setShowHouseholdSelector }) => {
2837
if (data.success) {
2938
setFeedbackMessage(data.success);
3039
} else {
31-
setFeedbackMessage(data.error);
40+
console.log("Got error during signup:", data);
41+
setFeedbackMessage(getFirstErrorMessage(data.error));
3242
}
3343

3444
}

0 commit comments

Comments
 (0)