Files
website-v2/libraries/utils.py
Lacey Williams Henschel 688ae87e76 Add methods to retrieve adoc content for libraries
(Part of #394 and #252)

- Add method to the GitHub API class to retrieve a specific file from a repo by its tag and path (to retrieve README or adocc files)
- Add method to Library model to retrieve the description content and render it
- Fail gracefully if no content is found
- Add caching logic for redis and database caching
2023-06-15 15:08:42 -07:00

47 lines
1.3 KiB
Python

import structlog
import tempfile
from dateutil.parser import ParserError, parse
from django.utils.text import slugify
logger = structlog.get_logger()
def decode_content(content):
"""Decode bytes to string."""
if isinstance(content, bytes):
return content.decode("utf-8")
return content
def generate_fake_email(val: str) -> str:
"""Slugify a string to make a fake email.
Would not necessarily be unique -- this is a lazy way for us to avoid creating
multiple new user records for one contributor who contributes to multiple libraries.
"""
slug = slugify(val)
local_email = slug.replace("-", "_")[:50]
return f"{local_email}@example.com"
def parse_date(date_str):
"""Parses a date string to a datetime. Does not return an error."""
try:
return parse(date_str)
except ParserError:
logger.info("parse_date_invalid_date", date_str=date_str)
return None
def write_content_to_tempfile(content):
"""Accepts string or bytes content, writes it to a temporary file, and returns the
file object."""
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
if isinstance(content, bytes):
temp_file = open(temp_file.name, "wb")
temp_file.write(content)
temp_file.close()
return temp_file