Skip to content

Commit 0d01632

Browse files
committed
allow slashes in project name
1 parent 380b5b5 commit 0d01632

File tree

2 files changed

+95
-91
lines changed

2 files changed

+95
-91
lines changed

api/api_legacy.py

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -82,47 +82,8 @@ def get_users_projects(request, username: str):
8282
return projects
8383

8484

85-
@api.get(
86-
"/users/{username}/projects/{projectname}", summary="Get a Project's full details."
87-
)
88-
def get_project(request, username: str, projectname: str):
89-
"""
90-
Get a project's full details
91-
"""
92-
project = get_object_or_404(Project, user__username=username, name=projectname)
93-
94-
if (
95-
request.user.is_authenticated and request.user.username == username
96-
) or project.is_public:
97-
if project.thumbnail:
98-
with open(f"{settings.MEDIA_ROOT}/{project.thumbnail}", "rb") as image_file:
99-
encoded_thumbnail = encoded_thumbnail = base64.b64encode(
100-
image_file.read()
101-
).decode("utf-8")
102-
else:
103-
encoded_thumbnail = ""
104-
with open(f"{settings.MEDIA_ROOT}/{project.project_file}", "r") as project_file:
105-
projectfile = project_file.read()
10685

107-
project.views = project.views + 1
108-
project.save(no_timestamp=True)
109-
110-
return {
111-
"projectname": project.name,
112-
"username": project.user.username,
113-
"notes": project.notes,
114-
"thumbnail": f"data:image/png;base64,{encoded_thumbnail}",
115-
"contents": f"{projectfile}",
116-
"ispublic": project.is_public,
117-
"updated": project.date_updated,
118-
"id": project.id,
119-
"views": project.views,
120-
}
121-
else:
122-
raise HttpError(401, "Unauthorized. Note that this project is not public.")
123-
124-
125-
@api.get("/users/{username}/projects/{projectname}/image")
86+
@api.get("/users/{username}/projects/{path:projectname}/image")
12687
def get_project_thumbnail(request, username: str, projectname: str):
12788
"""
12889
Get a project's thumbnail.
@@ -142,7 +103,7 @@ def get_project_thumbnail(request, username: str, projectname: str):
142103
raise HttpError(401, "Unauthorized. Note that this project is not public.")
143104

144105

145-
@api.get("/users/{username}/projects/{projectname}/visibility", auth=django_auth)
106+
@api.get("/users/{username}/projects/{path:projectname}/visibility", auth=django_auth)
146107
def set_project_visibility(
147108
request, username: str, projectname: str, ispublic: bool = True
148109
):
@@ -169,7 +130,7 @@ def set_project_visibility(
169130
raise HttpError(401, "Unauthorized. Note that this project is not public.")
170131

171132

172-
@api.get("/users/{username}/projects/{projectname}/delete", auth=django_auth)
133+
@api.get("/users/{username}/projects/{path:projectname}/delete", auth=django_auth)
173134
def delete_project(request, username: str, projectname: str):
174135
"""
175136
Delete a Project
@@ -282,3 +243,45 @@ def save_project(
282243
pass #ingore projects that don't exit
283244

284245
return {"text": f"project {projectname} {'created' if created else 'updated'}"}
246+
247+
248+
249+
250+
@api.get(
251+
"/users/{username}/projects/{path:projectname}", summary="Get a Project's full details."
252+
)
253+
def get_project(request, username: str, projectname: str):
254+
"""
255+
Get a project's full details
256+
"""
257+
project = get_object_or_404(Project, user__username=username, name=projectname)
258+
259+
if (
260+
request.user.is_authenticated and request.user.username == username
261+
) or project.is_public:
262+
if project.thumbnail:
263+
with open(f"{settings.MEDIA_ROOT}/{project.thumbnail}", "rb") as image_file:
264+
encoded_thumbnail = encoded_thumbnail = base64.b64encode(
265+
image_file.read()
266+
).decode("utf-8")
267+
else:
268+
encoded_thumbnail = ""
269+
with open(f"{settings.MEDIA_ROOT}/{project.project_file}", "r") as project_file:
270+
projectfile = project_file.read()
271+
272+
project.views = project.views + 1
273+
project.save(no_timestamp=True)
274+
275+
return {
276+
"projectname": project.name,
277+
"username": project.user.username,
278+
"notes": project.notes,
279+
"thumbnail": f"data:image/png;base64,{encoded_thumbnail}",
280+
"contents": f"{projectfile}",
281+
"ispublic": project.is_public,
282+
"updated": project.date_updated,
283+
"id": project.id,
284+
"views": project.views,
285+
}
286+
else:
287+
raise HttpError(401, "Unauthorized. Note that this project is not public.")

api/api_v1.py

Lines changed: 50 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -295,52 +295,7 @@ def get_users_projects(request, username: str):
295295
return ProjectList(projects=projects)
296296

297297

298-
@api.get(
299-
"/projects/{username}/{projectname}/thumbnail",
300-
description="returns a base64 encoded image string",
301-
)
302-
def get_project_thumbnail(request, username: str, projectname: str):
303-
"""
304-
Get a project's thumbnail.
305-
"""
306-
project = Project.objects.get(user__username=username, name=projectname)
307-
if (
308-
request.user.is_authenticated and request.user.username == username
309-
) or project.is_public:
310-
with open(f"{settings.MEDIA_ROOT}/{project.thumbnail}", "rb") as image_file:
311-
encoded_thumbnail = base64.b64encode(image_file.read()).decode("utf-8")
312-
return HttpResponse(
313-
f"data:image/png;base64,{encoded_thumbnail}", content_type="text/html"
314-
)
315-
else:
316-
raise HttpError(401, "Unauthorized. Note that this project is not public.")
317-
318-
319-
@api.get(
320-
"/projects/{username}/{projectname}",
321-
description="returns XML project file",
322-
)
323-
def get_project(request, username: str, projectname: str, updatingnotes: bool = True):
324-
"""
325-
Load a project.
326-
"""
327-
project = Project.objects.get(user__username=username, name=projectname)
328-
if (
329-
request.user.is_authenticated and request.user.username == username
330-
) or project.is_public:
331-
project.views = project.views + 1
332-
project.save(no_timestamp=True)
333-
with open(f"{settings.MEDIA_ROOT}/{project.project_file}", "r") as project_file:
334-
contents = project_file.read()
335-
return HttpResponse(
336-
f'<snapdata>{contents}<media name="{project.name}" app="Snap! 4.2, http://snap.berkeley.edu" version="1"/></snapdata>',
337-
content_type="text/xml",
338-
)
339-
else:
340-
raise HttpError(401, "Unauthorized. Note that this project is not public.")
341-
342-
343-
@api.get("/projects/{username}/{projectname}/versions")
298+
@api.get("/projects/{username}/{path:projectname}/versions")
344299
def get_project_versions(request, username: str, projectname: str):
345300
"""
346301
Get a Project's Versions (returns and empty array for now)
@@ -350,7 +305,7 @@ def get_project_versions(request, username: str, projectname: str):
350305

351306

352307
@api.post(
353-
"/projects/{username}/{projectname}",
308+
"/projects/{username}/{path:projectname}",
354309
description="saves a project",
355310
)
356311
def save_project(request, username: str, projectname: str):
@@ -431,7 +386,7 @@ def save_project(request, username: str, projectname: str):
431386
return Message(message=f"project {projectname} saved")
432387

433388

434-
@api.post("/projects/{username}/{projectname}/metadata")
389+
@api.post("/projects/{username}/{path:projectname}/metadata")
435390
def set_project_visibility(
436391
request,
437392
username: str,
@@ -463,7 +418,28 @@ def set_project_visibility(
463418
raise HttpError(401, "Unauthorized. Note that this project is not public.")
464419

465420

466-
@api.delete("/projects/{username}/{projectname}")
421+
@api.get(
422+
"/projects/{username}/{path:projectname}/thumbnail",
423+
description="returns a base64 encoded image string",
424+
)
425+
def get_project_thumbnail(request, username: str, projectname: str):
426+
"""
427+
Get a project's thumbnail.
428+
"""
429+
project = Project.objects.get(user__username=username, name=projectname)
430+
if (
431+
request.user.is_authenticated and request.user.username == username
432+
) or project.is_public:
433+
with open(f"{settings.MEDIA_ROOT}/{project.thumbnail}", "rb") as image_file:
434+
encoded_thumbnail = base64.b64encode(image_file.read()).decode("utf-8")
435+
return HttpResponse(
436+
f"data:image/png;base64,{encoded_thumbnail}", content_type="text/html"
437+
)
438+
else:
439+
raise HttpError(401, "Unauthorized. Note that this project is not public.")
440+
441+
442+
@api.delete("/projects/{username}/{path:projectname}")
467443
def delete_project(request, username: str, projectname: str):
468444
"""
469445
Delete a Project
@@ -478,3 +454,28 @@ def delete_project(request, username: str, projectname: str):
478454
}
479455
else:
480456
raise HttpError(401, "Unauthorized. Note that this project is not public.")
457+
458+
459+
@api.get(
460+
"/projects/{username}/{path:projectname}",
461+
description="returns XML project file",
462+
)
463+
def get_project(request, username: str, projectname: str, updatingnotes: bool = True):
464+
"""
465+
Load a project.
466+
"""
467+
project = Project.objects.get(user__username=username, name=projectname)
468+
if (
469+
request.user.is_authenticated and request.user.username == username
470+
) or project.is_public:
471+
project.views = project.views + 1
472+
project.save(no_timestamp=True)
473+
with open(f"{settings.MEDIA_ROOT}/{project.project_file}", "r") as project_file:
474+
contents = project_file.read()
475+
return HttpResponse(
476+
f'<snapdata>{contents}<media name="{project.name}" app="Snap! 4.2, http://snap.berkeley.edu" version="1"/></snapdata>',
477+
content_type="text/xml",
478+
)
479+
else:
480+
raise HttpError(401, "Unauthorized. Note that this project is not public.")
481+

0 commit comments

Comments
 (0)