prune_captcha 1.8.0__py3-none-any.whl → 1.10.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- captcha_prune/utils.py +3 -3
- {prune_captcha-1.8.0.dist-info → prune_captcha-1.10.0.dist-info}/METADATA +41 -29
- {prune_captcha-1.8.0.dist-info → prune_captcha-1.10.0.dist-info}/RECORD +5 -6
- captcha_prune/context_processors.py +0 -12
- {prune_captcha-1.8.0.dist-info → prune_captcha-1.10.0.dist-info}/WHEEL +0 -0
- {prune_captcha-1.8.0.dist-info → prune_captcha-1.10.0.dist-info}/top_level.txt +0 -0
captcha_prune/utils.py
CHANGED
@@ -10,7 +10,7 @@ from django.urls import reverse
|
|
10
10
|
|
11
11
|
|
12
12
|
def create_and_get_puzzle(request: HttpRequest) -> HttpResponse | dict:
|
13
|
-
|
13
|
+
_, _, puzzle_images_path = settings.PUZZLE_IMAGE_STATIC_PATH.rpartition("static/")
|
14
14
|
try:
|
15
15
|
response = requests.post(
|
16
16
|
request.build_absolute_uri(reverse("captcha:create-captcha"))
|
@@ -20,7 +20,7 @@ def create_and_get_puzzle(request: HttpRequest) -> HttpResponse | dict:
|
|
20
20
|
request.session["puzzle_uuid"] = response["uuid"]
|
21
21
|
puzzle_images = [
|
22
22
|
f
|
23
|
-
for f in os.listdir(
|
23
|
+
for f in os.listdir(settings.PUZZLE_IMAGE_STATIC_PATH)
|
24
24
|
if f.lower().endswith((".jpg", ".jpeg", ".png", ".gif"))
|
25
25
|
]
|
26
26
|
selected_image = random.choice(puzzle_images)
|
@@ -34,7 +34,7 @@ def create_and_get_puzzle(request: HttpRequest) -> HttpResponse | dict:
|
|
34
34
|
"pos_y_solution": response["pos_y_solution"],
|
35
35
|
"piece_pos_x": response["piece_pos_x"],
|
36
36
|
"piece_pos_y": response["piece_pos_y"],
|
37
|
-
"image": f"{
|
37
|
+
"image": f"{puzzle_images_path}{selected_image}",
|
38
38
|
}
|
39
39
|
|
40
40
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: prune_captcha
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.10.0
|
4
4
|
Summary: A tool to protect formulaire from spam.
|
5
5
|
Author-email: Arnout <bastien@prune.sh>
|
6
6
|
Project-URL: Made_by, https://prune.sh/
|
@@ -61,81 +61,94 @@ Don't hesitate to regularly run `poetry update`, as the captcha evolves with tim
|
|
61
61
|
In `settings.py`, set the path to the images used for the puzzle:
|
62
62
|
|
63
63
|
```python
|
64
|
-
PUZZLE_IMAGE_STATIC_PATH = "website/images/"
|
64
|
+
PUZZLE_IMAGE_STATIC_PATH = "website/static/website/images/"
|
65
65
|
```
|
66
66
|
|
67
67
|
### Utilisation
|
68
68
|
|
69
69
|
- GET request (form display)
|
70
70
|
|
71
|
-
- Use create_and_get_puzzle to generate the captcha data
|
71
|
+
- Use create_and_get_puzzle to generate the captcha data:
|
72
72
|
|
73
|
-
|
73
|
+
```python
|
74
|
+
from captcha_prune.utils import create_and_get_puzzle
|
75
|
+
```
|
74
76
|
|
75
|
-
|
77
|
+
```python
|
78
|
+
puzzle = create_and_get_puzzle(request)
|
79
|
+
```
|
80
|
+
|
81
|
+
- Passes the data into the context under the puzzle variable:
|
76
82
|
|
77
83
|
```python
|
78
|
-
|
84
|
+
return render(
|
85
|
+
request,
|
86
|
+
"website/pages/contact/page.html",
|
87
|
+
{"form": form, "puzzle": puzzle},
|
88
|
+
)
|
79
89
|
```
|
80
90
|
|
91
|
+
- Include the component in your template:
|
92
|
+
|
81
93
|
```
|
82
94
|
{% include "captcha_prune/captcha.html" %}
|
83
95
|
```
|
84
96
|
|
85
97
|
- POST request (form submission)
|
86
98
|
|
87
|
-
- Use verify_captcha to validate the captcha
|
99
|
+
- Use verify_captcha to validate the captcha:
|
88
100
|
|
89
101
|
```python
|
90
102
|
from captcha_prune.utils import verify_captcha
|
91
103
|
```
|
92
104
|
|
93
105
|
```python
|
94
|
-
|
106
|
+
response = verify_captcha(
|
107
|
+
request, redirect("/"), redirect("website:contact-page"), form
|
108
|
+
)
|
95
109
|
```
|
96
110
|
|
97
|
-
-
|
111
|
+
- None if the captcha is correct.
|
98
112
|
|
99
|
-
- Redirects in case of expired session or incorrect captcha
|
113
|
+
- Redirects in case of expired session or incorrect captcha:
|
114
|
+
|
115
|
+
```python
|
116
|
+
if response is not None:
|
117
|
+
return response
|
118
|
+
```
|
100
119
|
|
101
120
|
### Example
|
102
121
|
|
103
122
|
```python
|
104
|
-
from django.shortcuts import render, redirect
|
105
|
-
|
106
|
-
from django.contrib import messages
|
107
|
-
from captcha_prune.utils import create_and_get_puzzle, verify_captcha
|
108
|
-
from .forms import ContactForm
|
109
|
-
|
110
123
|
def contact_view(request):
|
111
124
|
if request.method == "POST":
|
112
125
|
form = ContactForm(request.POST)
|
113
126
|
if form.is_valid():
|
114
|
-
verify_captcha(
|
115
|
-
request,
|
116
|
-
redirect("/"),
|
117
|
-
redirect("website:contact-page"),
|
118
|
-
form
|
127
|
+
response = verify_captcha(
|
128
|
+
request, redirect("/"), redirect("website:contact-page"), form
|
119
129
|
)
|
120
|
-
|
121
|
-
return
|
122
|
-
|
123
|
-
|
130
|
+
if response is not None:
|
131
|
+
return response
|
132
|
+
messages.success(request, "Formulaire soumis avec succès.")
|
133
|
+
return redirect("/")
|
124
134
|
else:
|
125
|
-
form = ContactForm()
|
126
135
|
puzzle = create_and_get_puzzle(request)
|
136
|
+
else:
|
137
|
+
form = ContactForm()
|
138
|
+
puzzle = create_and_get_puzzle(request)
|
127
139
|
return render(
|
128
140
|
request,
|
129
141
|
"website/pages/contact/page.html",
|
130
142
|
{"form": form, "puzzle": puzzle},
|
131
143
|
)
|
132
|
-
|
133
|
-
```
|
144
|
+
```
|
134
145
|
|
135
146
|
# Available Versions
|
136
147
|
|
137
148
|
| Version | Date | Notes |
|
138
149
|
| ------- | ---------- | ---------------------------------- |
|
150
|
+
| 1.10.0 | 2025-05-20 | fix documentation, removed ... |
|
151
|
+
| 1.9.0 | 2025-05-20 | puzzle images path fixed |
|
139
152
|
| 1.8.0 | 2025-05-20 | added migrations |
|
140
153
|
| 1.7.0 | 2025-05-20 | PUZZLE_IMAGE_STATIC_PATH ... |
|
141
154
|
| 1.6.0 | 2025-05-20 | added templates |
|
@@ -145,4 +158,3 @@ PUZZLE_IMAGE_STATIC_PATH = "website/images/"
|
|
145
158
|
| 1.2.0 | 2025-04-30 | fixed prune_captcha command, ... |
|
146
159
|
| 1.1.0 | 2025-04-30 | start_server was not a module, ... |
|
147
160
|
| 1.0.0 | 2025-04-29 | First version of the `captcha` ... |
|
148
|
-
```
|
@@ -1,12 +1,11 @@
|
|
1
1
|
captcha_prune/__init__.py,sha256=JerrqDuZCUa8pj_9pEv68rnlPsiXovRP4biKpCqyThs,61
|
2
2
|
captcha_prune/apps.py,sha256=WVAz3WWaPAgM7-Ojd_Cl2KVdcub1n-03qpnRyu2ToTo,422
|
3
3
|
captcha_prune/asgi.py,sha256=wi2rRLFltXOZyve8mAB_E8udaFyONOf5N42WrWIQX8M,403
|
4
|
-
captcha_prune/context_processors.py,sha256=RTHgIxoje5n2wr1YvefbgUlvwNfiCe7Eyz9VKVoN4ZA,383
|
5
4
|
captcha_prune/models.py,sha256=O8nxhVfPat3oaDGZzd88kQHkGayQIWZ_dOO9uu1R6P4,1240
|
6
5
|
captcha_prune/payloads.py,sha256=PwR48xKg9YEgGgoJmGe7ywwFPCqM4gumomyFunn-Ems,115
|
7
6
|
captcha_prune/settings.py,sha256=YEZHEjYYYK-cH3gSLIR3a7g4Bypnuf_5eMTTcm719CE,3395
|
8
7
|
captcha_prune/urls.py,sha256=DeCJTjJA0krW27KoHafvh3GBRr7fJ80E2lVHEWYSsW4,271
|
9
|
-
captcha_prune/utils.py,sha256=
|
8
|
+
captcha_prune/utils.py,sha256=3AYKlLxLUdGf9SBGg5Mgzym7LlxBpDhYv4ITFFZ0nAc,2415
|
10
9
|
captcha_prune/views.py,sha256=BzjQfXLwYx2YSWODrnGpokqU8XeC-9QORivzWKxYofY,1539
|
11
10
|
captcha_prune/wsgi.py,sha256=fukA_iiCT4FFzcJ0QX2Zr_HNddqdq-ln3ien2UWcCTA,403
|
12
11
|
captcha_prune/migrations/0001_initial.py,sha256=QMTaeSIxPociSrV4r89zfsbxMwMu4qpL16LT3yPgcaw,831
|
@@ -18,7 +17,7 @@ commons/decorators.py,sha256=nU_3SyxENcWDdxo03VyNYEvoevplC6ig7BFogY8apNs,1306
|
|
18
17
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
18
|
tests/captcha_prune/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
19
|
tests/captcha_prune/test_views.py,sha256=h-Mrdiprh71s7kIJPYAt6xv4G_S7vp51WCpAzy4CZ6U,2364
|
21
|
-
prune_captcha-1.
|
22
|
-
prune_captcha-1.
|
23
|
-
prune_captcha-1.
|
24
|
-
prune_captcha-1.
|
20
|
+
prune_captcha-1.10.0.dist-info/METADATA,sha256=DVW1Kulk4o16TNlXHBkAxovoGG2XbyS2G9ywg4P-34g,4311
|
21
|
+
prune_captcha-1.10.0.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
22
|
+
prune_captcha-1.10.0.dist-info/top_level.txt,sha256=EB4h0WF_YGF7kAWB0XtqmuloOhkL5pC71CzgEVYam7w,28
|
23
|
+
prune_captcha-1.10.0.dist-info/RECORD,,
|
@@ -1,12 +0,0 @@
|
|
1
|
-
from django.conf import settings
|
2
|
-
from django.core.exceptions import ImproperlyConfigured
|
3
|
-
|
4
|
-
|
5
|
-
def puzzle_static_path(request):
|
6
|
-
try:
|
7
|
-
path = settings.PUZZLE_IMAGE_STATIC_PATH
|
8
|
-
except AttributeError:
|
9
|
-
raise ImproperlyConfigured(
|
10
|
-
"Vous devez définir PUZZLE_IMAGE_STATIC_PATH dans votre settings.py"
|
11
|
-
)
|
12
|
-
return {"PUZZLE_IMAGE_STATIC_PATH": path}
|
File without changes
|
File without changes
|