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 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
- puzzle_path = getattr(settings, "PUZZLE_IMAGE_STATIC_PATH", None)
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(puzzle_path)
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"{settings.PUZZLE_IMAGE_STATIC_PATH}{selected_image}",
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.8.0
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
- - Passes the data into the context under the puzzle variable.
73
+ ```python
74
+ from captcha_prune.utils import create_and_get_puzzle
75
+ ```
74
76
 
75
- - Include the component in your template:
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
- from captcha_prune.utils import create_and_get_puzzle
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
- verify_captcha(request, redirect("/"), redirect("website:contact-page"), form)
106
+ response = verify_captcha(
107
+ request, redirect("/"), redirect("website:contact-page"), form
108
+ )
95
109
  ```
96
110
 
97
- - No feedback if the captcha is correct.
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
- messages.success(request, "Formulaire soumis avec succès.")
121
- return redirect("/")
122
- else:
123
- puzzle = create_and_get_puzzle(request)
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=mSephcboPbl0zEmy9g2KVSMx7UvSeh6szCwGaJtF_pw,2391
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.8.0.dist-info/METADATA,sha256=ZX7pqfZJ_BpvUCooSk7D6KG9jdFdIzfS3AwQWxZiU84,3982
22
- prune_captcha-1.8.0.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
23
- prune_captcha-1.8.0.dist-info/top_level.txt,sha256=EB4h0WF_YGF7kAWB0XtqmuloOhkL5pC71CzgEVYam7w,28
24
- prune_captcha-1.8.0.dist-info/RECORD,,
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}