diff --git a/bottle-docker/.gitignore b/bottle-docker/.gitignore deleted file mode 100644 index b6e4761..0000000 --- a/bottle-docker/.gitignore +++ /dev/null @@ -1,129 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ diff --git a/bottle-docker/README.md b/bottle-docker/README.md deleted file mode 100644 index 2c49794..0000000 --- a/bottle-docker/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# kontor-bottle -Kontor with Python Bottle Framework diff --git a/bottle-docker/app/Dockerfile b/bottle-docker/app/Dockerfile deleted file mode 100644 index 2974a07..0000000 --- a/bottle-docker/app/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# set base image (host OS) -FROM python:3.8 - -# set the working directory in the container -WORKDIR /code - -# copy the dependencies file to the working directory -COPY requirements.txt /code/ - -# copy the content of the local src directory to the working directory -COPY src/ /code/ - -# install dependencies -RUN pip install --upgrade pip && pip install --no-cache-dir -r requirements.txt - -EXPOSE 9000 - -# command to run on container start -CMD [ "python", "./kontor.py" ] diff --git a/bottle-docker/app/requirements.txt b/bottle-docker/app/requirements.txt deleted file mode 100644 index 8e5db27..0000000 --- a/bottle-docker/app/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -pymongo -bottle diff --git a/bottle-docker/app/src/comics/__init__.py b/bottle-docker/app/src/comics/__init__.py deleted file mode 100644 index 6afff02..0000000 --- a/bottle-docker/app/src/comics/__init__.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import comics.publisherDAO -import comics.artistDAO -import comics.comicDAO -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.publishers = publisherDAO.PublisherDAO(database) - self.artists = artistDAO.ArtistDAO(database) - self.comics = comicDAO.ComicDAO(database) - self.routing() - - - def routing(self): - self.app.route('/comics/', 'GET', self.comic_index) - self.app.route('/comics/comic', 'GET', self.comic_list) - self.app.route('/comics/comic/', 'GET', self.comic_details) - self.app.route('/comics/comic/create', 'GET', self.get_comic_create) - self.app.route('/comics/comic/create', 'POST', self.post_create_comic) - self.app.route('/comics/publisher', 'GET', self.publisher_list) - self.app.route('/comics/publisher/', 'GET', self.publisher_details) - self.app.route('/comics/publisher/create', 'GET', self.get_publisher_create) - self.app.route('/comics/publisher/create', 'POST', self.post_create_publisher) - self.app.route('/comics/artist', 'GET', self.artist_list) - self.app.route('/comics/artist/', 'GET', self.artist_details) - self.app.route('/comics/artist/create', 'GET', self.get_artist_create) - self.app.route('/comics/artist/create', 'POST', self.post_create_artist) - self.app.route('/comics/storyarc', 'GET', self.storyarc_list) - self.app.route('/comics/storyarc/', 'GET', self.storyarc_details) - self.app.route('/comics/storyarc/create', 'GET', self.get_storyarc_create) - self.app.route('/comics/storyarc/create', 'POST', self.post_create_storyarc) - - def comic_index(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template('comic_index', dict(username=username)) - - - def comic_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.comics.get_comics() - return bottle.template('comic_list', dict(comics=l, username=username)) - - - def comic_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - comic = self.comics.get_comic(id) - errors = "" - if comic == None: - errors = "Entry not found" - return bottle.template('comic_template', dict(title=comic['title'], - id=comic['_id'], - current_order=comic['current_order'], - completed=comic['completed'], - errors="", - username=username)) - - - def get_comic_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("comic_template", dict(title="", - id='newentry', - current_order=False, - completed=False, - errors="", - username=username)) - - - def post_create_comic(self): - comic_id = bottle.request.forms.get("id") - comic_title = bottle.request.forms.get("title") - comic_order = bottle.request.forms.get("current_order") - comic_completed = bottle.request.forms.get("completed") - if comic_id == "newentry": - self.comics.insert_entry(comic_title, None, comic_order, comic_completed) - else: - self.comics.update_entry(comic_id, comic_title, None, comic_order, comic_completed) - bottle.redirect("/comics/comic") - - - def publisher_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.publishers.get_publishers() - return bottle.template('publisher_list', dict(publishers=l, username=username)) - - - def publisher_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - publisher = self.publishers.get_publisher(id) - errors = "" - if publisher == None: - errors= "Entry not found" - return bottle.template('publisher_template', dict(name=publisher['name'], id=publisher['_id'], errors="", username=username)) - - - def get_publisher_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("publisher_template", dict(name="", id='newentry', errors="", username=username)) - - - def post_create_publisher(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - publisher_id = bottle.request.forms.get("id") - publisher_name = bottle.request.forms.get("name") - if publisher_id == "newentry": - self.publishers.insert_entry(publisher_name) - else: - self.publishers.update_entry(publisher_id, publisher_name) - bottle.redirect("/comics/publisher") - - - def artist_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.artists.get_artists() - return bottle.template('artist_list', dict(artists=l, username=username)) - - - def artist_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - artist = self.artists.get_artist(id) - errors = "" - if artist == None: - errors= "Entry not found" - return bottle.template('artist_template', dict(name=artist['name'], id=artist['_id'], errors="", username=username)) - - - def get_artist_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("artist_template", dict(name="", id='newentry', errors="", username=username)) - - - def post_create_artist(self): - artist_id = bottle.request.forms.get("id") - artist_name = bottle.request.forms.get("name") - if artist_id == "newentry": - self.artists.insert_entry(artist_name) - else: - self.artists.update_entry(artist_id, artist_name) - bottle.redirect("/comics/artist") - - - def storyarc_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.storyarcs.get_storyarcs() - return bottle.template('storyarc_list', dict(storyarcs=l, username=username)) - - - def storyarc_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - storyarc = self.storyarcs.get_storyarc(id) - errors = "" - if storyarc == None: - errors = "Entry not found" - return bottle.template('storyarc_template', dict(title=storyarc['title'], id=storyarc['_id'], errors="", username=username)) - - - def get_storyarc_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("storyarc_template", dict(title="", id='newentry', errors="", username=username)) - - - def post_create_storyarc(self): - storyarc_id = bottle.request.forms.get("id") - storyarc_title = bottle.request.forms.get("title") - if storyarc_id == "newentry": - self.storyarcs.insert_entry(storyarc_title) - else: - self.storyarcs.update_entry(storyarc_id, storyarc_title) - bottle.redirect("/comics/storyarc") diff --git a/bottle-docker/app/src/comics/artistDAO.py b/bottle-docker/app/src/comics/artistDAO.py deleted file mode 100644 index 3ef93b9..0000000 --- a/bottle-docker/app/src/comics/artistDAO.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class ArtistDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.artists = database.artists - - def get_artists(self): - cursor = self.artists.find() - l = [] - for artist in cursor: - l.append({'name':artist['name'], '_id':artist['_id']}) - return l - - def get_artist(self, artist_id): - artist = self.artists.find_one({"_id": ObjectId(artist_id)}) - return artist - - def insert_entry(self, artist_name): - print("inserting artist entry", artist_name) - - artist = {"name": artist_name} - - # now insert the post - try: - result = self.artists.insert_one(artist) - print("Matching artist: ", result.matched_count) - print("Modified artist: ", result.modified_count) - except: - print("Error inserting artist") - print("Unexpected error:", sys.exc_info()) - - def update_entry(self, artist_id, artist_name): - print("upserting artist entry", artist_name) - - filter_doc = {"_id": ObjectId(artist_id)} - artist = { "$set": {"name": artist_name}} - - # now insert the post - try: - result = self.artists.update_one(filter_doc, artist) - print("Modified artist: ", result.modified_count) - except: - print("Error inserting artist") - print("Unexpected error:", sys.exc_info()) diff --git a/bottle-docker/app/src/comics/comicDAO.py b/bottle-docker/app/src/comics/comicDAO.py deleted file mode 100644 index 82c122b..0000000 --- a/bottle-docker/app/src/comics/comicDAO.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class ComicDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.comics = database.comics - - def get_comics(self): - cursor = self.comics.find() - l = [] - for comic in cursor: - l.append({'title':comic['title'], - '_id':comic['_id'], - 'current_order':comic['current_order'], - 'completed':comic['completed']}) - return l - - def get_comic(self, comic_id): - comic = self.comics.find_one({"_id": ObjectId(comic_id)}) - return comic - - def insert_entry(self, comic_title, comic_publisher=None, comic_order=False, comic_completed=False): - print("inserting comic entry", comic_title) - - comic = {"title": comic_title, "current_order": comic_order, "completed": comic_completed} - - # now insert the comic - try: - result = self.comics.insert_one(comic) - print("Modified comic: ", result.modified_count) - except: - print("Error inserting comic") - print("Unexpected error:", sys.exc_info()) - - def update_entry(self, comic_id, comic_title, comic_publisher=None, comic_order=False, comic_completed=False): - print("upserting comic entry", comic_title) - - filter_doc = {"_id": ObjectId(comic_id)} - comic = { "$set": {"title": comic_title, 'current_order': comic_order, 'completed': comic_completed}} - - # now insert the post - try: - result = self.comics.update_one(filter_doc, comic) - print("Matching comic: ", result.matched_count) - print("Modified comic: ", result.modified_count) - except: - print("Error inserting comic") - print("Unexpected error:", sys.exc_info()) \ No newline at end of file diff --git a/bottle-docker/app/src/comics/models.py b/bottle-docker/app/src/comics/models.py deleted file mode 100644 index 1cca3b1..0000000 --- a/bottle-docker/app/src/comics/models.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -from mongoengine import connect, Document -from mongoengine import StringField, BooleanField -from mongoengine import ListField, ReferenceField, GenericReferenceField -import pprint - - -class Publisher(Document): - name = StringField(required=True) - - def __str__(self): - s = "Publisher(%s)" % self.name - return s - - -class Artist(Document): - name = StringField(required=True) - className = StringField() - - def __str__(self): - s = "Artist(%s)" % self.name - return s - - -class Issue(Document): - number = StringField() - comic = GenericReferenceField() - is_read = BooleanField(default=False) - is_stock = BooleanField(default=False) - - def __str__(self): - s = "Issue(%s # %s, %s)" % (self.comic.title, self.number, self.is_read) - return s - - -class StoryArc(Document): - name = StringField(required=True) - comic = GenericReferenceField() - issues = ListField(ReferenceField(Issue)) - - def __str__(self): - s = "StoryArc(%s, %s)" % (self.name, self.comic.title) - return s - - -class Volume(Document): - name = StringField(required=True) - comic = GenericReferenceField() - issues = ListField(ReferenceField(Issue)) - - def __str__(self): - s = "Volume(%s, %s, %s)" % (self.id, self.name, self.comic.title) - return s - - -class Comic(Document): - title = StringField(required=True) - publisher = ReferenceField(Publisher) - current_order = BooleanField() - completed = BooleanField() - issues = ListField(ReferenceField(Issue)) - stories = ListField(ReferenceField(StoryArc)) - - def __str__(self): - if self.publisher is None: - s = "Comic(%s, %s, %s, %s)" % (self.title, self.publisher, self.current_order, self.completed) - return s - else: - s = "Comic(%s, %s, %s, %s)" % ( - self.title, self.publisher.name, self.current_order, self.completed) - return s - - -class TradePaperback(Document): - comic = ReferenceField(Comic) - issue_start = StringField() - issue_end = StringField() - - def __str__(self): - s = "TPB(%s)" % self.comic.title - return s - - -def get_publisher(name): - publisher = Publisher.objects(name=name) - if publisher.count() > 0: - return publisher[0] - else: - return None - - -def get_comic(title): - comic = Comic.objects(title=title) - if comic.count() > 0: - return comic[0] - else: - return None - - -def get_issue(title, number): - comic = get_comic(title) - issues = Issue.objects(number=number, comic=comic) - if issues.count() > 0: - return issues[0] - else: - return None - -if __name__ == '__main__': - connect('comics') - for publisher in Publisher.objects: - pprint.pprint(publisher) - for artist in Artist.objects: - pprint.pprint(artist) - for comic in Comic.objects: - pprint.pprint(comic) - for issue in Issue.objects: - pprint.pprint(issue) - for story in StoryArc.objects: - pprint.pprint(story) - for tpb in TradePaperback.objects: - pprint.pprint(tpb) diff --git a/bottle-docker/app/src/comics/publisherDAO.py b/bottle-docker/app/src/comics/publisherDAO.py deleted file mode 100644 index f6a3cfe..0000000 --- a/bottle-docker/app/src/comics/publisherDAO.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class PublisherDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.publishers = database.publishers - - def get_publishers(self): - cursor = self.publishers.find() - l = [] - for publisher in cursor: - l.append({'name':publisher['name'], '_id':publisher['_id']}) - return l - - def get_publisher(self, publisher_id): - publisher = self.publishers.find_one({"_id": ObjectId(publisher_id)}) - return publisher - - def insert_entry(self, publisher_name): - print("inserting publisher entry", publisher_name) - - publisher = {"name": publisher_name} - - # now insert the post - try: - result = self.publishers.insert_one(publisher) - print("Matching publisher: ", result.matched_count) - print("Modified publisher: ", result.modified_count) - except: - print("Error inserting publisher") - print("Unexpected error:", sys.exc_info()) - - def update_entry(self, publisher_id, publisher_name): - print("upserting publisher entry", publisher_name) - - filter_doc = {"_id": ObjectId(publisher_id)} - publisher = { "$set": {"name": publisher_name}} - - # now insert the post - try: - result = self.publishers.update_one(filter_doc, publisher) - print("Modified publisher: ", result.modified_count) - except: - print("Error inserting publisher") - print("Unexpected error:", sys.exc_info()) diff --git a/bottle-docker/app/src/comics/storyArcDAO.py b/bottle-docker/app/src/comics/storyArcDAO.py deleted file mode 100644 index afe49a5..0000000 --- a/bottle-docker/app/src/comics/storyArcDAO.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - - -class StoryArcDAO: - # constructor for the class - def __init__(self, database): - self.db = database - self.storyarcs = database.storyarcs - - def get_storyarcs(self): - cursor = self.storyarcs.find() - l = [] - for storyarc in cursor: - l.append({'title': storyarc['title'], '_id': storyarc['_id']}) - return l - - def get_storyarc(self, storyarc_id): - storyarc = self.storyarcs.find_one({"_id": ObjectId(storyarc_id)}) - return storyarc - - def insert_entry(self, storyarc_title): - print("inserting publisher entry", storyarc_title) - - storyarc = {"name": storyarc_title} - - # now insert the post - try: - result = self.storyarcs.insert_one(storyarc) - print("Matching storyarc: ", result.matched_count) - print("Modified storyarc: ", result.modified_count) - except: - print("Error inserting storyarc") - print("Unexpected error:", sys.exc_info()) - - def update_entry(self, storyarc_id, storyarc_title): - print("upserting storyarc entry", storyarc_title) - - filter_doc = {"_id": ObjectId(storyarc_id)} - storyarc = {"$set": {"name": storyarc_title}} - - # now insert the post - try: - result = self.storyarcs.update_one(filter_doc, storyarc) - print("Modified storyarc: ", result.modified_count) - except: - print("Error inserting storyarc") - print("Unexpected error:", sys.exc_info()) diff --git a/bottle-docker/app/src/kontor.css b/bottle-docker/app/src/kontor.css deleted file mode 100644 index 979f80f..0000000 --- a/bottle-docker/app/src/kontor.css +++ /dev/null @@ -1,89 +0,0 @@ -body { -font-family: sans-serif; -color: #333333; -padding:4em 0 4em; -} -body, -.wrapper { -margin: 10px auto; -/*max-width: 60em;*/ -} - -header, nav, nav a, main, section, footer { -border-radius: 0px 0.5em 0.5em; -border: 1px solid; -padding: 10px; -margin: 10px; -} - -header { -position:fixed; -top:0px; -left:0px; -right:0px; -text-align:center; -padding:10px; -background: lightgrey; -/*border-bottom: 1px solid #d5d5d5;*/ -} - -nav { - position: fixed; - padding-top: 10em; - -font-size: 0.91em; -float: left; -width: 15em; -padding: 0; -background: lightskyblue; -border-color: skyblue; -} - -nav ul { -padding: 0; -} - -nav li { -list-style: none; -margin: 0; -padding: 0.1em; -} - -nav a { -display: block; -padding: 0.2em 10px; -font-weight: bold; -text-decoration: none; -background-color: skyblue; -color: #333; -} - -nav ul a:hover, -nav ul a:active { -color: #fffbf0; -background-color: #dfac20; -} - -main { -display: block; -background: lightblue; -border-color: #8a9da8; -margin-left: 15em; -min-width: 16em; /* Mindestbreite (der Überschrift) verhindert Anzeigefehler in modernen Browsern */ -} - -footer { -position:fixed; -padding: 10px; -margin-top: 10px; -bottom:0; -left: 0; -right:0; -background: lightgrey; -border-color: grey; -} - -footer p { -float:right; -margin: 0; -} diff --git a/bottle-docker/app/src/kontor.py b/bottle-docker/app/src/kontor.py deleted file mode 100644 index e6309bc..0000000 --- a/bottle-docker/app/src/kontor.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- -import pymongo -import sessionDAO -import userDAO -import comics -#import library -import bottle -import cgi -import re - - -__author__ = 'tpeetz' - -app = bottle.Bottle() - - -def index(): - cookie = bottle.request.get_cookie("session") - username = sessions.get_username(cookie) - return bottle.template('kontor', dict(username=username)) - - -def show_signup(): - return bottle.template("signup", dict(username="", - password="", - password_error="", - email="", - username_error="", - email_error="", - verify_error ="")) - - -def process_signup(): - email = bottle.request.forms.get("email") - username = bottle.request.forms.get("username") - password = bottle.request.forms.get("password") - verify = bottle.request.forms.get("verify") - - # set these up in case we have an error case - errors = {'username': cgi.escape(username), 'email': cgi.escape(email)} - if validate_signup(username, password, verify, email, errors): - - if not users.add_user(username, password, email): - # this was a duplicate - errors['username_error'] = "Username already in use. Please choose another" - return bottle.template("signup", errors) - - session_id = sessions.start_session(username) - print(session_id) - bottle.response.set_cookie("session", session_id) - bottle.redirect("/welcome") - else: - print("user did not validate") - return bottle.template("signup", errors) - - -def show_login(): - return bottle.template('login', dict(username="", password="", login_error="")) - -def process_login(): - username = bottle.request.forms.get("username") - password = bottle.request.forms.get("password") - - print("user submitted ", username, "pass ", password) - - user_record = users.validate_login(username, password) - if user_record: - # username is stored in the user collection in the _id key - session_id = sessions.start_session(user_record['_id']) - - if session_id is None: - bottle.redirect("/internal_error") - - cookie = session_id - - # Warning, if you are running into a problem whereby the cookie being set here is - # not getting set on the redirect, you are probably using the experimental version of bottle (.12). - # revert to .11 to solve the problem. - bottle.response.set_cookie("session", cookie) - - bottle.redirect("/") - - else: - return bottle.template("login", dict(username=cgi.escape(username), password="", login_error="Invalid Login")) - - -def process_logout(): - cookie = bottle.request.get_cookie("session") - sessions.end_session(cookie) - bottle.response.set_cookie("session", "") - bottle.redirect("/") - - -def send_stylesheet(filename): - return bottle.static_file(filename, root='.', mimetype='text/css') - - -def setup_routing(app): - app.route('/', 'GET', index) - app.route('/signup', 'GET', show_signup) - app.route('/signup', 'POST', process_signup) - app.route('/login', 'GET', show_login) - app.route('/login', 'POST', process_login) - app.route('/logout', 'GET', process_logout) - app.route('/css/', 'GET', send_stylesheet) - - -# validates that the user information is valid for new signup, return True of False -# and fills in the error string if there is an issue -def validate_signup(username, password, verify, email, errors): - USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") - PASS_RE = re.compile(r"^.{3,20}$") - EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$") - - errors['username_error'] = "" - errors['password_error'] = "" - errors['verify_error'] = "" - errors['email_error'] = "" - - if not USER_RE.match(username): - errors['username_error'] = "invalid username. try just letters and numbers" - return False - - if not PASS_RE.match(password): - errors['password_error'] = "invalid password." - return False - if password != verify: - errors['verify_error'] = "password must match" - return False - if email != "": - if not EMAIL_RE.match(email): - errors['email_error'] = "invalid email address" - return False - return True - - -setup_routing(app) - -connection = pymongo.MongoClient("mongodb://mongodb") -database = connection.kontor - -users = userDAO.UserDAO(database) -sessions = sessionDAO.SessionDAO(database) - -comics_plugin = comics.Plugin(app, database, sessions) -#library_plugin = library.Plugin(app, database, sessions) -print("starting app Kontor") -bottle.run(app, host="0.0.0.0", port=9000, debug=True) diff --git a/bottle-docker/app/src/sessionDAO.py b/bottle-docker/app/src/sessionDAO.py deleted file mode 100644 index 29a09cd..0000000 --- a/bottle-docker/app/src/sessionDAO.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys -import random -import string - - -# The session Data Access Object handles interactions with the sessions collection - -class SessionDAO: - - def __init__(self, database): - self.db = database - self.sessions = database.sessions - - # will start a new session id by adding a new document to the sessions collection - # returns the sessionID or None - def start_session(self, username): - - session_id = self.get_random_str(32) - session = {'username': username, '_id': session_id} - - try: - self.sessions.insert_one(session) - except: - print("Unexpected error on start_session:", sys.exc_info()[0]) - return None - - return str(session['_id']) - - # will send a new user session by deleting from sessions table - def end_session(self, session_id): - - if session_id is None: - return - - self.sessions.delete_one({'_id': session_id}) - - return - - # if there is a valid session, it is returned - def get_session(self, session_id): - - if session_id is None: - return None - - session = self.sessions.find_one({'_id': session_id}) - - return session - - # get the username of the current session, or None if the session is not valid - def get_username(self, session_id): - - session = self.get_session(session_id) - if session is None: - return None - else: - return session['username'] - - def get_random_str(self, num_chars): - random_string = "" - for i in range(num_chars): - random_string = random_string + random.choice(string.ascii_letters) - return random_string diff --git a/bottle-docker/app/src/userDAO.py b/bottle-docker/app/src/userDAO.py deleted file mode 100644 index 62b19e3..0000000 --- a/bottle-docker/app/src/userDAO.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -import random -import string -import hashlib -import pymongo - - -# The User Data Access Object handles all interactions with the User collection. -class UserDAO: - - def __init__(self, db): - self.db = db - self.users = self.db.users - self.SECRET = 'verysecret' - - # makes a little salt - def make_salt(self): - salt = "" - for i in range(5): - salt = salt + random.choice(string.ascii_letters) - return salt - - # implement the function make_pw_hash(name, pw) that returns a hashed password - # of the format: - # HASH(pw + salt),salt - # use sha256 - - def make_pw_hash(self, pw,salt=None): - if salt == None: - salt = self.make_salt() - return hashlib.sha256(pw + salt).hexdigest()+","+ salt - - # Validates a user login. Returns user record or None - def validate_login(self, username, password): - - user = None - try: - user = self.users.find_one({'_id': username}) - except: - print("Unable to query database for user") - - if user is None: - print("User not in database") - return None - - salt = user['password'].split(',')[1] - - if user['password'] != self.make_pw_hash(password, salt): - print("user password is not a match") - return None - - # Looks good - return user - - - # creates a new user in the users collection - def add_user(self, username, password, email): - password_hash = self.make_pw_hash(password) - - user = {'_id': username, 'password': password_hash} - if email != "": - user['email'] = email - - try: - self.users.insert_one(user) - except pymongo.errors.OperationFailure: - print("oops, mongo error") - return False - except pymongo.errors.DuplicateKeyError: - print("oops, username is already taken") - return False - - return True diff --git a/bottle-docker/app/src/views/artist_list.tpl b/bottle-docker/app/src/views/artist_list.tpl deleted file mode 100644 index 366d4b7..0000000 --- a/bottle-docker/app/src/views/artist_list.tpl +++ /dev/null @@ -1,39 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/artist_template.tpl b/bottle-docker/app/src/views/artist_template.tpl deleted file mode 100644 index f981355..0000000 --- a/bottle-docker/app/src/views/artist_template.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - - diff --git a/bottle-docker/app/src/views/comic_index.tpl b/bottle-docker/app/src/views/comic_index.tpl deleted file mode 100644 index 529a38e..0000000 --- a/bottle-docker/app/src/views/comic_index.tpl +++ /dev/null @@ -1,34 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/comic_list.tpl b/bottle-docker/app/src/views/comic_list.tpl deleted file mode 100644 index a947073..0000000 --- a/bottle-docker/app/src/views/comic_list.tpl +++ /dev/null @@ -1,44 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- - - -%for comic in comics: - - - -%end - -
TitleCurrent OrderCompleted
{{comic['title']}}{{comic['current_order']}}{{comic['completed']}}
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/comic_template.tpl b/bottle-docker/app/src/views/comic_template.tpl deleted file mode 100644 index 38f190e..0000000 --- a/bottle-docker/app/src/views/comic_template.tpl +++ /dev/null @@ -1,51 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- - -

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/kontor.tpl b/bottle-docker/app/src/views/kontor.tpl deleted file mode 100644 index 260cb88..0000000 --- a/bottle-docker/app/src/views/kontor.tpl +++ /dev/null @@ -1,27 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
-
-%if (username == None): -
Login

Ingenieurbüro Thomas Peetz

-%end -%if (username != None): - -%end - - diff --git a/bottle-docker/app/src/views/login.tpl b/bottle-docker/app/src/views/login.tpl deleted file mode 100644 index 881a1af..0000000 --- a/bottle-docker/app/src/views/login.tpl +++ /dev/null @@ -1,52 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- - - - - - - - - - - - - -
Username
Password{{login_error}}
- - -
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/publisher_list.tpl b/bottle-docker/app/src/views/publisher_list.tpl deleted file mode 100644 index 7139e17..0000000 --- a/bottle-docker/app/src/views/publisher_list.tpl +++ /dev/null @@ -1,39 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/publisher_template.tpl b/bottle-docker/app/src/views/publisher_template.tpl deleted file mode 100644 index 91cbc4a..0000000 --- a/bottle-docker/app/src/views/publisher_template.tpl +++ /dev/null @@ -1,42 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/signup.tpl b/bottle-docker/app/src/views/signup.tpl deleted file mode 100644 index 2b3790c..0000000 --- a/bottle-docker/app/src/views/signup.tpl +++ /dev/null @@ -1,59 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-

Signup

-
- - - - - - - - - - - - - - - - - - - - -
Username{{username_error}}
Password{{password_error}}
Verify Password{{verify_error}}
Email (optional){{email_error}}
- -
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/storyarc_list.tpl b/bottle-docker/app/src/views/storyarc_list.tpl deleted file mode 100644 index 82a5ce3..0000000 --- a/bottle-docker/app/src/views/storyarc_list.tpl +++ /dev/null @@ -1,40 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/app/src/views/storyarc_template.tpl b/bottle-docker/app/src/views/storyarc_template.tpl deleted file mode 100644 index 010d885..0000000 --- a/bottle-docker/app/src/views/storyarc_template.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle-docker/docker-compose.yaml b/bottle-docker/docker-compose.yaml deleted file mode 100644 index 2469e59..0000000 --- a/bottle-docker/docker-compose.yaml +++ /dev/null @@ -1,31 +0,0 @@ -services: - mongodb: - image: mongo - restart: always - volumes: - - db-data:/var/lib/mongo - networks: - - backend-network - app: - build: app - restart: always - ports: - - 9000:9000 - networks: - - backend-network - - frontend-network - nginx: - image: nginx - restart: always - volumes: - - ./nginx:/etc/nginx/conf.d - - ./front-end:/var/www/front-end - ports: - - 8070:80 - networks: - - frontend-network -volumes: - db-data: -networks: - backend-network: - frontend-network: diff --git a/bottle-docker/front-end/index.html b/bottle-docker/front-end/index.html deleted file mode 100644 index a9a660b..0000000 --- a/bottle-docker/front-end/index.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - Hello! - - - - - - -
- -

Hello there!

-

Simple DEV environment setup with Docker and Docker Compose

-
-

Set url path(default is '/'), then query the app service.

-
- - -
-

Server response

-
- -
-
-
- - - - - - diff --git a/bottle-docker/nginx/nginx.conf b/bottle-docker/nginx/nginx.conf deleted file mode 100644 index 7be3c45..0000000 --- a/bottle-docker/nginx/nginx.conf +++ /dev/null @@ -1,14 +0,0 @@ -server { - listen 80; - server_name localhost; - root /var/www/front-end; - - location /api { - proxy_pass http://app:9000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } -} - diff --git a/bottle/.gitignore b/bottle/.gitignore deleted file mode 100644 index 46f885b..0000000 --- a/bottle/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -.idea/ -__pycache__/ -bin/ -include/ -lib/ -lib64 -pip-selfcheck.json -*.pyc -kontor.properties -*.nja -dist/ -kontor_bottle.egg-info/ diff --git a/bottle/Jenkinsfile b/bottle/Jenkinsfile deleted file mode 100644 index 61b613c..0000000 --- a/bottle/Jenkinsfile +++ /dev/null @@ -1,13 +0,0 @@ -node { - stage("Checkout") { - checkout scm - } - stage("setup virualenv") { - sh "virtualenv ." - sh "source bin/activate; pip install bottle pymongo" - } - stage("build") { - sh "source bin/activate; python setup.py sdist" - } -} - diff --git a/bottle/README.md b/bottle/README.md deleted file mode 100644 index 67c879f..0000000 --- a/bottle/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Kontor Bottle - diff --git a/bottle/comics/__init__.py b/bottle/comics/__init__.py deleted file mode 100644 index f8b4dc1..0000000 --- a/bottle/comics/__init__.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import publisherDAO -import artistDAO -import comicDAO -import storyArcDAO -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.publishers = publisherDAO.PublisherDAO(database) - self.artists = artistDAO.ArtistDAO(database) - self.comics = comicDAO.ComicDAO(database) - self.storyarcs = storyArcDAO.StoryArcDAO(database) - self.routing() - - - def routing(self): - self.app.route('/comics', 'GET', self.comic_index) - self.app.route('/comics/', 'GET', self.comic_index) - self.app.route('/comics/comic', 'GET', self.comic_list) - self.app.route('/comics/comic/', 'GET', self.comic_details) - self.app.route('/comics/comic/create', 'GET', self.get_comic_create) - self.app.route('/comics/comic/create', 'POST', self.post_create_comic) - self.app.route('/comics/publisher', 'GET', self.publisher_list) - self.app.route('/comics/publisher/', 'GET', self.publisher_details) - self.app.route('/comics/publisher/create', 'GET', self.get_publisher_create) - self.app.route('/comics/publisher/create', 'POST', self.post_create_publisher) - self.app.route('/comics/artist', 'GET', self.artist_list) - self.app.route('/comics/artist/', 'GET', self.artist_details) - self.app.route('/comics/artist/create', 'GET', self.get_artist_create) - self.app.route('/comics/artist/create', 'POST', self.post_create_artist) - self.app.route('/comics/storyarc', 'GET', self.storyarc_list) - self.app.route('/comics/storyarc/', 'GET', self.storyarc_details) - self.app.route('/comics/storyarc/create', 'GET', self.get_storyarc_create) - self.app.route('/comics/storyarc/create', 'POST', self.post_create_storyarc) - - def comic_index(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template('comic_index', dict(username=username)) - - - def comic_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.comics.get_comics() - return bottle.template('comic_list', dict(comics=l, username=username)) - - - def comic_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - comic = self.comics.get_comic(id) - errors = "" - if comic == None: - errors = "Entry not found" - return bottle.template('comic_template', dict(title=comic['title'], - id=comic['_id'], - current_order=comic['current_order'], - completed=comic['completed'], - errors="", - username=username)) - - - def get_comic_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("comic_template", dict(title="", - id='newentry', - current_order=False, - completed=False, - errors="", - username=username)) - - - def post_create_comic(self): - comic_id = bottle.request.forms.get("id") - comic_title = bottle.request.forms.get("title") - comic_order = bottle.request.forms.get("current_order") - comic_completed = bottle.request.forms.get("completed") - if comic_id == "newentry": - self.comics.insert_entry(comic_title, None, comic_order, comic_completed) - else: - self.comics.update_entry(comic_id, comic_title, None, comic_order, comic_completed) - bottle.redirect("/comics/comic") - - - def publisher_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.publishers.get_publishers() - return bottle.template('publisher_list', dict(publishers=l, username=username)) - - - def publisher_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - publisher = self.publishers.get_publisher(id) - errors = "" - if publisher == None: - errors= "Entry not found" - return bottle.template('publisher_template', dict(name=publisher['name'], id=publisher['_id'], errors="", username=username)) - - - def get_publisher_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("publisher_template", dict(name="", id='newentry', errors="", username=username)) - - - def post_create_publisher(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - publisher_id = bottle.request.forms.get("id") - publisher_name = bottle.request.forms.get("name") - if publisher_id == "newentry": - self.publishers.insert_entry(publisher_name) - else: - self.publishers.update_entry(publisher_id, publisher_name) - bottle.redirect("/comics/publisher") - - - def artist_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.artists.get_artists() - return bottle.template('artist_list', dict(artists=l, username=username)) - - - def artist_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - artist = self.artists.get_artist(id) - errors = "" - if artist == None: - errors= "Entry not found" - return bottle.template('artist_template', dict(name=artist['name'], id=artist['_id'], errors="", username=username)) - - - def get_artist_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("artist_template", dict(name="", id='newentry', errors="", username=username)) - - - def post_create_artist(self): - artist_id = bottle.request.forms.get("id") - artist_name = bottle.request.forms.get("name") - if artist_id == "newentry": - self.artists.insert_entry(artist_name) - else: - self.artists.update_entry(artist_id, artist_name) - bottle.redirect("/comics/artist") - - - def storyarc_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.storyarcs.get_storyarcs() - return bottle.template('storyarc_list', dict(storyarcs=l, username=username)) - - - def storyarc_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - storyarc = self.storyarcs.get_storyarc(id) - errors = "" - if storyarc == None: - errors = "Entry not found" - return bottle.template('storyarc_template', dict(title=storyarc['title'], id=storyarc['_id'], errors="", username=username)) - - - def get_storyarc_create(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("storyarc_template", dict(title="", id='newentry', errors="", username=username)) - - - def post_create_storyarc(self): - storyarc_id = bottle.request.forms.get("id") - storyarc_title = bottle.request.forms.get("title") - if storyarc_id == "newentry": - self.storyarcs.insert_entry(storyarc_title) - else: - self.storyarcs.update_entry(storyarc_id, storyarc_title) - bottle.redirect("/comics/storyarc") diff --git a/bottle/comics/artistDAO.py b/bottle/comics/artistDAO.py deleted file mode 100644 index b2a6003..0000000 --- a/bottle/comics/artistDAO.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class ArtistDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.artists = database.artists - - def get_artists(self): - cursor = self.artists.find() - l = [] - for artist in cursor: - l.append({'name':artist['name'], '_id':artist['_id']}) - return l - - def get_artist(self, artist_id): - artist = self.artists.find_one({"_id": ObjectId(artist_id)}) - return artist - - def insert_entry(self, artist_name): - print "inserting artist entry", artist_name - - artist = {"name": artist_name} - - # now insert the post - try: - result = self.artists.insert_one(artist) - print "Matching artist: ", result.matched_count - print "Modified artist: ", result.modified_count - except: - print "Error inserting artist" - print "Unexpected error:", sys.exc_info() - - def update_entry(self, artist_id, artist_name): - print "upserting artist entry", artist_name - - filter_doc = {"_id": ObjectId(artist_id)} - artist = { "$set": {"name": artist_name}} - - # now insert the post - try: - result = self.artists.update_one(filter_doc, artist) - print "Modified artist: ", result.modified_count - except: - print "Error inserting artist" - print "Unexpected error:", sys.exc_info() - diff --git a/bottle/comics/comicDAO.py b/bottle/comics/comicDAO.py deleted file mode 100644 index 6caa8ce..0000000 --- a/bottle/comics/comicDAO.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class ComicDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.comics = database.comics - - def get_comics(self): - cursor = self.comics.find() - l = [] - for comic in cursor: - l.append({'title':comic['title'], - '_id':comic['_id'], - 'current_order':comic['current_order'], - 'completed':comic['completed']}) - return l - - def get_comic(self, comic_id): - comic = self.comics.find_one({"_id": ObjectId(comic_id)}) - return comic - - def insert_entry(self, comic_title, comic_publisher=None, comic_order=False, comic_completed=False): - print "inserting comic entry", comic_title - - comic = {"title": comic_title, "current_order": comic_order, "completed": comic_completed} - - # now insert the comic - try: - result = self.comics.insert_one(comic) - print "Modified comic: ", result.modified_count - except: - print "Error inserting comic" - print "Unexpected error:", sys.exc_info() - - def update_entry(self, comic_id, comic_title, comic_publisher=None, comic_order=False, comic_completed=False): - print "upserting comic entry", comic_title - - filter_doc = {"_id": ObjectId(comic_id)} - comic = { "$set": {"title": comic_title, 'current_order': comic_order, 'completed': comic_completed}} - - # now insert the post - try: - result = self.comics.update_one(filter_doc, comic) - print "Matching comic: ", result.matched_count - print "Modified comic: ", result.modified_count - except: - print "Error inserting comic" - print "Unexpected error:", sys.exc_info() - diff --git a/bottle/comics/models.py b/bottle/comics/models.py deleted file mode 100644 index 1cca3b1..0000000 --- a/bottle/comics/models.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -from mongoengine import connect, Document -from mongoengine import StringField, BooleanField -from mongoengine import ListField, ReferenceField, GenericReferenceField -import pprint - - -class Publisher(Document): - name = StringField(required=True) - - def __str__(self): - s = "Publisher(%s)" % self.name - return s - - -class Artist(Document): - name = StringField(required=True) - className = StringField() - - def __str__(self): - s = "Artist(%s)" % self.name - return s - - -class Issue(Document): - number = StringField() - comic = GenericReferenceField() - is_read = BooleanField(default=False) - is_stock = BooleanField(default=False) - - def __str__(self): - s = "Issue(%s # %s, %s)" % (self.comic.title, self.number, self.is_read) - return s - - -class StoryArc(Document): - name = StringField(required=True) - comic = GenericReferenceField() - issues = ListField(ReferenceField(Issue)) - - def __str__(self): - s = "StoryArc(%s, %s)" % (self.name, self.comic.title) - return s - - -class Volume(Document): - name = StringField(required=True) - comic = GenericReferenceField() - issues = ListField(ReferenceField(Issue)) - - def __str__(self): - s = "Volume(%s, %s, %s)" % (self.id, self.name, self.comic.title) - return s - - -class Comic(Document): - title = StringField(required=True) - publisher = ReferenceField(Publisher) - current_order = BooleanField() - completed = BooleanField() - issues = ListField(ReferenceField(Issue)) - stories = ListField(ReferenceField(StoryArc)) - - def __str__(self): - if self.publisher is None: - s = "Comic(%s, %s, %s, %s)" % (self.title, self.publisher, self.current_order, self.completed) - return s - else: - s = "Comic(%s, %s, %s, %s)" % ( - self.title, self.publisher.name, self.current_order, self.completed) - return s - - -class TradePaperback(Document): - comic = ReferenceField(Comic) - issue_start = StringField() - issue_end = StringField() - - def __str__(self): - s = "TPB(%s)" % self.comic.title - return s - - -def get_publisher(name): - publisher = Publisher.objects(name=name) - if publisher.count() > 0: - return publisher[0] - else: - return None - - -def get_comic(title): - comic = Comic.objects(title=title) - if comic.count() > 0: - return comic[0] - else: - return None - - -def get_issue(title, number): - comic = get_comic(title) - issues = Issue.objects(number=number, comic=comic) - if issues.count() > 0: - return issues[0] - else: - return None - -if __name__ == '__main__': - connect('comics') - for publisher in Publisher.objects: - pprint.pprint(publisher) - for artist in Artist.objects: - pprint.pprint(artist) - for comic in Comic.objects: - pprint.pprint(comic) - for issue in Issue.objects: - pprint.pprint(issue) - for story in StoryArc.objects: - pprint.pprint(story) - for tpb in TradePaperback.objects: - pprint.pprint(tpb) diff --git a/bottle/comics/publisherDAO.py b/bottle/comics/publisherDAO.py deleted file mode 100644 index aeb3ad8..0000000 --- a/bottle/comics/publisherDAO.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class PublisherDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.publishers = database.publishers - - def get_publishers(self): - cursor = self.publishers.find() - l = [] - for publisher in cursor: - l.append({'name':publisher['name'], '_id':publisher['_id']}) - return l - - def get_publisher(self, publisher_id): - publisher = self.publishers.find_one({"_id": ObjectId(publisher_id)}) - return publisher - - def insert_entry(self, publisher_name): - print "inserting publisher entry", publisher_name - - publisher = {"name": publisher_name} - - # now insert the post - try: - result = self.publishers.insert_one(publisher) - print "Matching publisher: ", result.matched_count - print "Modified publisher: ", result.modified_count - except: - print "Error inserting publisher" - print "Unexpected error:", sys.exc_info() - - def update_entry(self, publisher_id, publisher_name): - print "upserting publisher entry", publisher_name - - filter_doc = {"_id": ObjectId(publisher_id)} - publisher = { "$set": {"name": publisher_name}} - - # now insert the post - try: - result = self.publishers.update_one(filter_doc, publisher) - print "Modified publisher: ", result.modified_count - except: - print "Error inserting publisher" - print "Unexpected error:", sys.exc_info() - diff --git a/bottle/comics/storyArcDAO.py b/bottle/comics/storyArcDAO.py deleted file mode 100644 index d987fc8..0000000 --- a/bottle/comics/storyArcDAO.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - - -class StoryArcDAO: - # constructor for the class - def __init__(self, database): - self.db = database - self.storyarcs = database.storyarcs - - def get_storyarcs(self): - cursor = self.storyarcs.find() - l = [] - for storyarc in cursor: - l.append({'title': storyarc['title'], '_id': storyarc['_id']}) - return l - - def get_storyarc(self, storyarc_id): - storyarc = self.storyarcs.find_one({"_id": ObjectId(storyarc_id)}) - return storyarc - - def insert_entry(self, storyarc_title): - print "inserting publisher entry", storyarc_title - - storyarc = {"name": storyarc_title} - - # now insert the post - try: - result = self.storyarcs.insert_one(storyarc) - print "Matching storyarc: ", result.matched_count - print "Modified storyarc: ", result.modified_count - except: - print "Error inserting storyarc" - print "Unexpected error:", sys.exc_info() - - def update_entry(self, storyarc_id, storyarc_title): - print "upserting storyarc entry", storyarc_title - - filter_doc = {"_id": ObjectId(storyarc_id)} - storyarc = {"$set": {"name": storyarc_title}} - - # now insert the post - try: - result = self.storyarcs.update_one(filter_doc, storyarc) - print "Modified storyarc: ", result.modified_count - except: - print "Error inserting storyarc" - print "Unexpected error:", sys.exc_info() diff --git a/bottle/homeoffice/__init__.py b/bottle/homeoffice/__init__.py deleted file mode 100644 index 3c7ba41..0000000 --- a/bottle/homeoffice/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.routing() - - - def routing(self): - self.app.route('/office', 'GET', self.office_index) - self.app.route('/office/travel', 'GET', self.office_index) - - - def office_index(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template('office_index', dict(username=username)) - diff --git a/bottle/kontor.css b/bottle/kontor.css deleted file mode 100644 index c61938e..0000000 --- a/bottle/kontor.css +++ /dev/null @@ -1,109 +0,0 @@ -body { - font-family: sans-serif; - color: #333333; - padding: 3em 0 4em; -} - -body, -.wrapper { - margin: 10px auto; - /*max-width: 60em;*/ -} - -header, main, section, footer { - border-radius: 0px 0.5em 0.5em; - border: 1px solid; - padding: 10px; - margin: 10px; -} - -header { - position:fixed; - top:0px; - left:0px; - right:0px; - text-align:center; - padding: 10px; - background: lightgrey; - /*border-bottom: 1px solid #d5d5d5;*/ -} - -nav { - /*position: fixed;*/ - /*padding-top: 10em; */ - - border-radius: 0px 0.5em 0.5em; - border: 1px solid; - - padding: 0; - margin: 10px; - - font-size: 0.91em; - float: left; - width: 15em; - background: lightskyblue; - border-color: skyblue; -} - -nav ul { - padding: 0; -} - -nav li { - list-style: none; - margin: 0.4em; - padding: 0; -} - -nav ul ul { - margin: 0 0 0 2em; - padding: 0; - border: none; -} - -nav ul ul li { - margin: 0.3em 0; -} - -nav a { - display: block; - padding: 0.4em; - text-decoration: none; - font-weight: bold; - border: 1px solid blue; - border-radius: 10px; - box-shadow: 0px 5px 10px white inset; - background-color: skyblue; - color: #333; - -} - -nav a:focus, -nav a:hover { - color: royalblue; - background-color: gold; -} - -main { - display: block; - background: lightblue; - border-color: #8a9da8; - margin-left: 15em; - min-width: 16em; /* Mindestbreite (der Überschrift) verhindert Anzeigefehler in modernen Browsern */ -} - -footer { - position:fixed; - padding: 10px; - margin-top: 10px; - bottom:0; - left: 0; - right:0; - background: lightgrey; - border-color: grey; -} - -footer p { - float:right; - margin: 0; -} diff --git a/bottle/kontor.py b/bottle/kontor.py deleted file mode 100644 index d11e27f..0000000 --- a/bottle/kontor.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -import pymongo -import sessionDAO -import userDAO -import homeoffice -import comics -import library -import medien -import tradingcards -import ConfigParser -import bottle -import cgi -import re - - -__author__ = 'tpeetz' - -app = bottle.Bottle() - - -def index(): - cookie = bottle.request.get_cookie("session") - username = sessions.get_username(cookie) - return bottle.template('kontor', dict(username=username)) - - -def show_signup(): - return bottle.template("signup", dict(username="", - password="", - password_error="", - email="", - username_error="", - email_error="", - verify_error ="")) - - -def process_signup(): - email = bottle.request.forms.get("email") - username = bottle.request.forms.get("username") - password = bottle.request.forms.get("password") - verify = bottle.request.forms.get("verify") - - # set these up in case we have an error case - errors = {'username': cgi.escape(username), 'email': cgi.escape(email)} - if validate_signup(username, password, verify, email, errors): - - if not users.add_user(username, password, email): - # this was a duplicate - errors['username_error'] = "Username already in use. Please choose another" - return bottle.template("signup", errors) - - session_id = sessions.start_session(username) - print session_id - bottle.response.set_cookie("session", session_id) - bottle.redirect("/welcome") - else: - print "user did not validate" - return bottle.template("signup", errors) - - -def show_login(): - return bottle.template('login', dict(username="", password="", login_error="")) - -def process_login(): - username = bottle.request.forms.get("username") - password = bottle.request.forms.get("password") - - print "user submitted ", username, "pass ", password - - user_record = users.validate_login(username, password) - if user_record: - # username is stored in the user collection in the _id key - session_id = sessions.start_session(user_record['_id']) - - if session_id is None: - bottle.redirect("/internal_error") - - cookie = session_id - - # Warning, if you are running into a problem whereby the cookie being set here is - # not getting set on the redirect, you are probably using the experimental version of bottle (.12). - # revert to .11 to solve the problem. - bottle.response.set_cookie("session", cookie) - - bottle.redirect("/") - - else: - return bottle.template("login", dict(username=cgi.escape(username), password="", login_error="Invalid Login")) - - -def process_logout(): - cookie = bottle.request.get_cookie("session") - sessions.end_session(cookie) - bottle.response.set_cookie("session", "") - bottle.redirect("/") - - -def send_stylesheet(filename): - return bottle.static_file(filename, root='.', mimetype='text/css') - - -def setup_routing(app): - app.route('/', 'GET', index) - app.route('/signup', 'GET', show_signup) - app.route('/signup', 'POST', process_signup) - app.route('/login', 'GET', show_login) - app.route('/login', 'POST', process_login) - app.route('/logout', 'GET', process_logout) - app.route('/css/', 'GET', send_stylesheet) - - -# validates that the user information is valid for new signup, return True of False -# and fills in the error string if there is an issue -def validate_signup(username, password, verify, email, errors): - USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") - PASS_RE = re.compile(r"^.{3,20}$") - EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$") - - errors['username_error'] = "" - errors['password_error'] = "" - errors['verify_error'] = "" - errors['email_error'] = "" - - if not USER_RE.match(username): - errors['username_error'] = "invalid username. try just letters and numbers" - return False - - if not PASS_RE.match(password): - errors['password_error'] = "invalid password." - return False - if password != verify: - errors['verify_error'] = "password must match" - return False - if email != "": - if not EMAIL_RE.match(email): - errors['email_error'] = "invalid email address" - return False - return True - - -setup_routing(app) - -config = ConfigParser.ConfigParser() -config.read('kontor.properties') -server = config.get('host', 'server') -port = config.get('host', 'port') - -db_server = config.get('database', 'server') -db_port = config.get('database', 'port') -db_admin = config.get('database', 'adminDB') -db_user = config.get('database', 'user') -db_password = config.get('database', 'password') -connection_string = "mongodb://" -if db_admin: - connection_string += db_user - connection_string += ':' - connection_string += db_password - connection_string += '@' - connection_string += db_server - connection_string += '?/authsource=' - connection_string += db_admin -else: - connection_string += db_server -connection = pymongo.MongoClient(connection_string) -database = connection.kontor - -users = userDAO.UserDAO(database) -sessions = sessionDAO.SessionDAO(database) - -office_plugin = homeoffice.Plugin(app, database, sessions) -comics_plugin = comics.Plugin(app, database, sessions) -library_plugin = library.Plugin(app, database, sessions) -medien_plugin = medien.Plugin(app, database, sessions) -tradingcards_plugin = tradingcards.Plugin(app, database, sessions) - -bottle.run(app, host=server, port=port, debug=True, reloader=True) - diff --git a/bottle/library/__init__.py b/bottle/library/__init__.py deleted file mode 100644 index 10b5da7..0000000 --- a/bottle/library/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import bookDAO -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.books = bookDAO.BookDAO(database) - self.routing() - - def routing(self): - self.app.route('/library', 'GET', self.book_list) - self.app.route('/library/book', 'GET', self.book_list) - self.app.route('/library/book/', 'GET', self.book_details) - self.app.route('/library/book/create', 'GET', self.get_book_create) - self.app.route('/library/book/create', 'POST', self.post_create_book) - - def book_list(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - l = self.books.get_books() - return bottle.template('book_list', dict(books=l, username=username)) - - def book_details(self, id): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - book = self.books.get_book(id) - errors = "" - if book == None: - errors = "Entry not found" - return bottle.template('book_template', dict(title=book['title'], - id=book['_id'], - current_order=book['current_order'], - completed=book['completed'], - errors="", - username=username)) - - def get_book_create(self): - cookie = bottle.rddequest.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template("book_template", dict(title="", - id='newentry', - current_order=False, - completed=False, - errors="", - username=username)) - - def post_create_book(self): - book_id = bottle.request.forms.get("id") - book_title = bottle.request.forms.get("title") - book_order = bottle.request.forms.get("current_order") - book_completed = bottle.request.forms.get("completed") - if book_id == "newentry": - self.books.insert_entry(book_title, None, book_order, book_completed) - else: - self.comics.update_entry(book_id, book_title, None, book_order, book_completed) - bottle.redirect("/comics/comic") diff --git a/bottle/library/bookDAO.py b/bottle/library/bookDAO.py deleted file mode 100644 index e057fa0..0000000 --- a/bottle/library/bookDAO.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -from bson.objectid import ObjectId -import sys - -class BookDAO: - - # constructor for the class - def __init__(self, database): - self.db = database - self.books = database.books - - def get_books(self): - cursor = self.books.find() - l = [] - for book in cursor: - l.append( - {'title':book['title'], - '_id':book['_id'], - 'publisher':book['publisher'], - 'isbn':book['isbn'], - 'author':book['author']} - ) - return l - - def get_book(self, book_id): - book = self.books.find_one({"_id": ObjectId(book_id)}) - return book - - def insert_entry(self, book_title): - print "inserting book entry", book_title - - book = {"title": book_title} - - # now insert the book - try: - result = self.books.insert_one(book) - print "Matching book: ", result.matched_count - print "Modified book: ", result.modified_count - except: - print "Error inserting book" - print "Unexpected error:", sys.exc_info() - - def update_entry(self, book_id, book_title): - print "updating book entry", book_title - - filter_doc = {"_id": ObjectId(book_id)} - book = { "$set": {"name": book_title}} - - # now insert the book - try: - result = self.books.update_one(filter_doc, book) - print "Modified book: ", result.modified_count - except: - print "Error inserting book" - print "Unexpected error:", sys.exc_info() - diff --git a/bottle/medien/__init__.py b/bottle/medien/__init__.py deleted file mode 100644 index 555e93b..0000000 --- a/bottle/medien/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.routing() - - def routing(self): - self.app.route('/medien', 'GET', self.media_index) - - def media_index(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template('media_index', dict(username=username)) - diff --git a/bottle/sessionDAO.py b/bottle/sessionDAO.py deleted file mode 100755 index ad98a47..0000000 --- a/bottle/sessionDAO.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys -import random -import string - - -# The session Data Access Object handles interactions with the sessions collection - -class SessionDAO: - - def __init__(self, database): - self.db = database - self.sessions = database.sessions - - # will start a new session id by adding a new document to the sessions collection - # returns the sessionID or None - def start_session(self, username): - - session_id = self.get_random_str(32) - session = {'username': username, '_id': session_id} - - try: - self.sessions.insert_one(session) - except: - print "Unexpected error on start_session:", sys.exc_info()[0] - return None - - return str(session['_id']) - - # will send a new user session by deleting from sessions table - def end_session(self, session_id): - - if session_id is None: - return - - self.sessions.delete_one({'_id': session_id}) - - return - - # if there is a valid session, it is returned - def get_session(self, session_id): - - if session_id is None: - return None - - session = self.sessions.find_one({'_id': session_id}) - - return session - - # get the username of the current session, or None if the session is not valid - def get_username(self, session_id): - - session = self.get_session(session_id) - if session is None: - return None - else: - return session['username'] - - def get_random_str(self, num_chars): - random_string = "" - for i in range(num_chars): - random_string = random_string + random.choice(string.ascii_letters) - return random_string diff --git a/bottle/setup.py b/bottle/setup.py deleted file mode 100644 index fad97fe..0000000 --- a/bottle/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -from setuptools import setup - -setup( - name='kontor-bottle', - packages=['comics', 'homeoffice', 'library', 'medien'], - include_package_data=True, - install_requires=[ - 'bottle', - 'pymongo' - ], -) diff --git a/bottle/tradingcards/__init__.py b/bottle/tradingcards/__init__.py deleted file mode 100644 index 83931d7..0000000 --- a/bottle/tradingcards/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding:utf-8 -*- -import pymongo -import bottle -import cgi - - -__author__ = 'tpeetz' - - -class Plugin: - - def __init__(self, app, database, sessions): - self.app = app - self.db = database - self.sessions = sessions - self.routing() - - def routing(self): - self.app.route('/tradingcards', 'GET', self.tradingcards_index) - - def tradingcards_index(self): - cookie = bottle.request.get_cookie("session") - username = self.sessions.get_username(cookie) - return bottle.template('tradingcards_index', dict(username=username)) - diff --git a/bottle/userDAO.py b/bottle/userDAO.py deleted file mode 100755 index fec2c8f..0000000 --- a/bottle/userDAO.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- - -import hmac -import random -import string -import hashlib -import pymongo - - -# The User Data Access Object handles all interactions with the User collection. -class UserDAO: - - def __init__(self, db): - self.db = db - self.users = self.db.users - self.SECRET = 'verysecret' - - # makes a little salt - def make_salt(self): - salt = "" - for i in range(5): - salt = salt + random.choice(string.ascii_letters) - return salt - - # implement the function make_pw_hash(name, pw) that returns a hashed password - # of the format: - # HASH(pw + salt),salt - # use sha256 - - def make_pw_hash(self, pw,salt=None): - if salt == None: - salt = self.make_salt(); - return hashlib.sha256(pw + salt).hexdigest()+","+ salt - - # Validates a user login. Returns user record or None - def validate_login(self, username, password): - - user = None - try: - user = self.users.find_one({'_id': username}) - except: - print "Unable to query database for user" - - if user is None: - print "User not in database" - return None - - salt = user['password'].split(',')[1] - - if user['password'] != self.make_pw_hash(password, salt): - print "user password is not a match" - return None - - # Looks good - return user - - - # creates a new user in the users collection - def add_user(self, username, password, email): - password_hash = self.make_pw_hash(password) - - user = {'_id': username, 'password': password_hash} - if email != "": - user['email'] = email - - try: - self.users.insert_one(user) - except pymongo.errors.OperationFailure: - print "oops, mongo error" - return False - except pymongo.errors.DuplicateKeyError as e: - print "oops, username is already taken" - return False - - return True - - diff --git a/bottle/views/artist_list.tpl b/bottle/views/artist_list.tpl deleted file mode 100644 index 366d4b7..0000000 --- a/bottle/views/artist_list.tpl +++ /dev/null @@ -1,39 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/artist_template.tpl b/bottle/views/artist_template.tpl deleted file mode 100644 index f981355..0000000 --- a/bottle/views/artist_template.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - - diff --git a/bottle/views/book_list.tpl b/bottle/views/book_list.tpl deleted file mode 100644 index a6bab72..0000000 --- a/bottle/views/book_list.tpl +++ /dev/null @@ -1,44 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- - - -%for book in books: - - - -%end - -
TitleCurrent OrderCompleted
{{book['title']}}{{book['current_order']}}{{book['completed']}}
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/comic_index.tpl b/bottle/views/comic_index.tpl deleted file mode 100644 index 529a38e..0000000 --- a/bottle/views/comic_index.tpl +++ /dev/null @@ -1,34 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/comic_list.tpl b/bottle/views/comic_list.tpl deleted file mode 100644 index a947073..0000000 --- a/bottle/views/comic_list.tpl +++ /dev/null @@ -1,44 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- - - -%for comic in comics: - - - -%end - -
TitleCurrent OrderCompleted
{{comic['title']}}{{comic['current_order']}}{{comic['completed']}}
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/comic_template.tpl b/bottle/views/comic_template.tpl deleted file mode 100644 index 38f190e..0000000 --- a/bottle/views/comic_template.tpl +++ /dev/null @@ -1,51 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- - -

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/kontor.tpl b/bottle/views/kontor.tpl deleted file mode 100644 index 76fa397..0000000 --- a/bottle/views/kontor.tpl +++ /dev/null @@ -1,28 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
-
-%if (username == None): -
Login

Ingenieurbüro Thomas Peetz

-%end -%if (username != None): - -%end - - diff --git a/bottle/views/login.tpl b/bottle/views/login.tpl deleted file mode 100644 index 881a1af..0000000 --- a/bottle/views/login.tpl +++ /dev/null @@ -1,52 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- - - - - - - - - - - - - -
Username
Password{{login_error}}
- - -
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/media_index.tpl b/bottle/views/media_index.tpl deleted file mode 100644 index 610e0ff..0000000 --- a/bottle/views/media_index.tpl +++ /dev/null @@ -1,32 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-

Medien

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/office_index.tpl b/bottle/views/office_index.tpl deleted file mode 100644 index 6b9e93d..0000000 --- a/bottle/views/office_index.tpl +++ /dev/null @@ -1,35 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-

HomeOffice

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/publisher_list.tpl b/bottle/views/publisher_list.tpl deleted file mode 100644 index 7139e17..0000000 --- a/bottle/views/publisher_list.tpl +++ /dev/null @@ -1,39 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/publisher_template.tpl b/bottle/views/publisher_template.tpl deleted file mode 100644 index 91cbc4a..0000000 --- a/bottle/views/publisher_template.tpl +++ /dev/null @@ -1,42 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/signup.tpl b/bottle/views/signup.tpl deleted file mode 100644 index 2b3790c..0000000 --- a/bottle/views/signup.tpl +++ /dev/null @@ -1,59 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-

Signup

-
- - - - - - - - - - - - - - - - - - - - -
Username{{username_error}}
Password{{password_error}}
Verify Password{{verify_error}}
Email (optional){{email_error}}
- -
-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/storyarc_list.tpl b/bottle/views/storyarc_list.tpl deleted file mode 100644 index 82a5ce3..0000000 --- a/bottle/views/storyarc_list.tpl +++ /dev/null @@ -1,40 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
- -
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/storyarc_template.tpl b/bottle/views/storyarc_template.tpl deleted file mode 100644 index 010d885..0000000 --- a/bottle/views/storyarc_template.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-
- {{errors}} -

Title

- -
-

- -

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/bottle/views/tradingcards_index.tpl b/bottle/views/tradingcards_index.tpl deleted file mode 100644 index a576a45..0000000 --- a/bottle/views/tradingcards_index.tpl +++ /dev/null @@ -1,32 +0,0 @@ - - - -Kontor - - - -
Kontor
- -
-
-

Trading Cards

-
-
-
-%if (username == None): - Login -%end -%if (username != None): - {{username}} -%end -

Ingenieurbüro Thomas Peetz

-
- - diff --git a/django/.gitignore b/django/.gitignore deleted file mode 100644 index 4d34ffb..0000000 --- a/django/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -bin/ -include/ -lib/ -lib64/ -lib64 -pip-selfcheck.json -<<<<<<< HEAD -<<<<<<< HEAD -*.pyc -kontor/db.sqlite3 -.idea/ -======= ->>>>>>> initial setup -======= -*.pyc ->>>>>>> ignore compiled scripts diff --git a/django/Jenkinsfile b/django/Jenkinsfile deleted file mode 100644 index 89b3672..0000000 --- a/django/Jenkinsfile +++ /dev/null @@ -1,13 +0,0 @@ -node { - stage "Checkout" - checkout scm - stage "make migrations" - sh "python kontor/manage.py makemigrations" - stage "execute tests" -<<<<<<< HEAD - sh "python kontor/manage.py test comics library medien tradingcards homeoffice" -======= - sh "python kontor/manage.py test commics library medien tradingcards homeoffice" ->>>>>>> add tests -} - diff --git a/django/README.md b/django/README.md deleted file mode 100644 index 708d77d..0000000 --- a/django/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Kontor Django - diff --git a/django/kontor/comics/admin.py b/django/kontor/comics/admin.py deleted file mode 100755 index 0f96082..0000000 --- a/django/kontor/comics/admin.py +++ /dev/null @@ -1,86 +0,0 @@ -from django.contrib import admin - -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> add Comic models -from .models import Publisher -from .models import Artist -from .models import Issue -from .models import StoryArc -from .models import Comic -from .models import TradePaperback -from .models import Volume - -<<<<<<< HEAD -# Register your models here. - - -class IssueInline(admin.StackedInline): - model = Issue - extra = 1 - - -class IssueAdmin(admin.ModelAdmin): - fields = ['comic', 'number', 'is_read', 'in_stock'] - - -class ComicAdmin(admin.ModelAdmin): - fields = ['title', 'publisher', 'writer', 'current_order', 'completed'] - inlines = [IssueInline] - - -class ComicInline(admin.StackedInline): - model = Comic - extra = 1 - - -class PublisherAdmin(admin.ModelAdmin): - inlines = [ComicInline] - - -admin.site.register(Publisher, PublisherAdmin) -admin.site.register(Artist) -admin.site.register(Issue, IssueAdmin) -admin.site.register(Volume) -admin.site.register(StoryArc) -admin.site.register(Comic, ComicAdmin) -admin.site.register(TradePaperback) -======= -# Register your models here. ->>>>>>> initial setup -======= -# Register your models here. - - -class IssueInline(admin.StackedInline): - model = Issue - extra = 1 - - -class IssueAdmin(admin.ModelAdmin): - fields = ['comic', 'number', 'is_read', 'in_stock'] - - -class ComicAdmin(admin.ModelAdmin): - fields = ['title', 'publisher', 'writer', 'artist', 'current_order', 'completed'] - inlines = [IssueInline] - - -class ComicInline(admin.StackedInline): - model = Comic - extra = 1 - - -class PublisherAdmin(admin.ModelAdmin): - inlines = [ComicInline] - - -admin.site.register(Publisher, PublisherAdmin) -admin.site.register(Artist) -admin.site.register(Issue, IssueAdmin) -admin.site.register(Volume) -admin.site.register(StoryArc) -admin.site.register(Comic, ComicAdmin) -admin.site.register(TradePaperback) ->>>>>>> add Comic models diff --git a/django/kontor/comics/apps.py b/django/kontor/comics/apps.py deleted file mode 100644 index 7c7e1bf..0000000 --- a/django/kontor/comics/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class ComicsConfig(AppConfig): - name = 'comics' diff --git a/django/kontor/comics/fixtures/comics.yaml b/django/kontor/comics/fixtures/comics.yaml deleted file mode 100755 index 0c20c1f..0000000 --- a/django/kontor/comics/fixtures/comics.yaml +++ /dev/null @@ -1,3048 +0,0 @@ -- model: comics.publisher - pk: 1 - fields: {name: Marvel} -- model: comics.publisher - pk: 2 - fields: {name: Alias} -- model: comics.publisher - pk: 3 - fields: {name: Crossgen} -- model: comics.publisher - pk: 4 - fields: {name: Image} -- model: comics.publisher - pk: 5 - fields: {name: Devils Due Publishing} -- model: comics.publisher - pk: 6 - fields: {name: Aspen} -- model: comics.publisher - pk: 7 - fields: {name: Bongo Comics} -- model: comics.publisher - pk: 8 - fields: {name: Kandora} -- model: comics.publisher - pk: 9 - fields: {name: DC} -- model: comics.publisher - pk: 10 - fields: {name: Marvel Knights} -- model: comics.publisher - pk: 11 - fields: {name: WildStorm} -- model: comics.publisher - pk: 12 - fields: {name: Cliffhanger} -- model: comics.publisher - pk: 13 - fields: {name: Dark Horse Comics} -- model: comics.publisher - pk: 14 - fields: {name: Broadsword} -- model: comics.publisher - pk: 15 - fields: {name: Dynamite Entertainment} -- model: comics.publisher - pk: 16 - fields: {name: Red Eagle Entertainment} -- model: comics.publisher - pk: 17 - fields: {name: Top Cow Productions} -- model: comics.publisher - pk: 18 - fields: {name: Pulp Fiction} -- model: comics.artist - pk: 1 - fields: {name: 'Turner, Michael'} -- model: comics.artist - pk: 2 - fields: {name: 'Marz, Ron'} -- model: comics.comic - pk: 1 - fields: {title: '1602', publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 2 - fields: {title: 10th Muse, publisher: 2, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 3 - fields: {title: Abadazad, publisher: 3, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 4 - fields: {title: Amazing Fantasy, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 5 - fields: {title: Amazing Spider-Man, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 6 - fields: {title: Arana, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 7 - fields: {title: Aria, publisher: 4, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 8 - fields: {title: Army of Darkness, publisher: 5, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 9 - fields: {title: Aspen, publisher: 6, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 10 - fields: {title: Astonishing X-Men, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 11 - fields: {title: Athena Inc. The Beginning, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 12 - fields: {title: Athena Inc. The Manhunter Project, publisher: 4, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 13 - fields: {title: Barbarossa & The Lost Corsairs, publisher: 8, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 14 - fields: {title: Bart Simpson, publisher: 7, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 15 - fields: {title: Bart Simpsons Treehouse of Horror, publisher: 7, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 16 - fields: {title: Battle Pope, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 17 - fields: {title: Birds of Prey, publisher: 9, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 18 - fields: {title: Black Widow, publisher: 10, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 19 - fields: {title: Black Widow 2, publisher: 10, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 20 - fields: {title: Bluntman and Chronic, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 21 - fields: {title: Brath, publisher: 3, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 22 - fields: {title: Catwoman When In Rome, publisher: 9, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 23 - fields: {title: Crimson, publisher: 11, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 24 - fields: {title: Crossgen, publisher: 3, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 25 - fields: {title: Danger Girl, publisher: 12, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 26 - fields: {title: Danger Girl Back in Black, publisher: 11, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 27 - fields: {title: Daring Escapes, publisher: 4, current_order: false, completed: true, - writer: null, artist: null} -- model: comics.comic - pk: 28 - fields: {title: Darkness / Superman, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 29 - fields: {title: Darkness / Tomb Raider, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 30 - fields: {title: Darkness / Vampirella, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 31 - fields: {title: Darkness Black Sails, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 32 - fields: {title: Darkness Vol. 2, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 33 - fields: {title: District X, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 34 - fields: {title: 'Dragonlance: Chronicles', publisher: 5, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 35 - fields: {title: Dream Police, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 36 - fields: {title: El Cazador, publisher: 3, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 37 - fields: {title: El Cazador The Bloody Ballad of Blackjack Tom, publisher: 3, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 38 - fields: {title: Elsinore, publisher: 2, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 39 - fields: {title: Emma Frost, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 40 - fields: {title: Excalibur, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 41 - fields: {title: Fathom, publisher: 6, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 42 - fields: {title: Fathom Beginnings, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 43 - fields: {title: Fathom Cannon Hawke, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 44 - fields: {title: Fathom Cannon Hawke Prelude, publisher: 6, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 45 - fields: {title: Fathom Dawn of War, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 46 - fields: {title: Fathom Prelude, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 47 - fields: {title: Fathom Swimsuit Special, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 48 - fields: {title: Fathom Swimsuit Special 2000, publisher: 6, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 49 - fields: {title: Fathom Vol. 2, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 50 - fields: {title: 'Fathom: Killians Tide', publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 51 - fields: {title: Flak Riot, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 52 - fields: {title: Freshmen, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 53 - fields: {title: Friendly Neighborhood Spider-Man, publisher: 1, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 54 - fields: {title: Futurama, publisher: 7, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 55 - fields: {title: Futurama Simpsons Crossover Crisis Part 2, publisher: 7, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 56 - fields: {title: Ghostrider, publisher: 10, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 57 - fields: {title: Gift, publisher: 4, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 58 - fields: {title: Hack Slash Land of Lost Toys, publisher: 5, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 59 - fields: {title: 'Hack/Slash: Girls Gone Dead', publisher: 5, current_order: false, - completed: false, writer: 1, artist: null} -- model: comics.comic - pk: 60 - fields: {title: Harry Johnson, publisher: 18, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 61 - fields: {title: Hellcop, publisher: 4, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 62 - fields: {title: Holiday Special 2004, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 63 - fields: {title: House of M, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 64 - fields: {title: Hunter-Killer, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 65 - fields: {title: Hunter-Killer Dossier, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 66 - fields: {title: Iron Ghost, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 67 - fields: {title: 'J.U.D.G.E.: Secret Rage', publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 68 - fields: {title: Kiss Kiss Bang Bang, publisher: 3, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 69 - fields: {title: Legend of Isis, publisher: 2, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 70 - fields: {title: Loki, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 71 - fields: {title: Lullaby, publisher: 4, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 72 - fields: {title: Magdalena / Vampirella 2, publisher: 17, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 73 - fields: {title: Marvel Knights Spider-Man, publisher: 10, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 74 - fields: {title: Marville, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 75 - fields: {title: Mary Jane, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 76 - fields: {title: Mary Jane Homecoming, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 77 - fields: {title: Megacity 909, publisher: 5, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 78 - fields: {title: Meridian, publisher: 3, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 79 - fields: {title: Midnight Nation, publisher: 4, current_order: false, completed: true, - writer: 1, artist: null} -- model: comics.comic - pk: 80 - fields: {title: Monster War, publisher: 4, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 81 - fields: {title: Monster War 2005, publisher: 4, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 82 - fields: {title: Mystic, publisher: 3, current_order: false, completed: false, writer: 1, - artist: null} -- model: comics.comic - pk: 83 - fields: {title: Mystique, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 84 - fields: {title: Necromancer, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 85 - fields: {title: Negation War, publisher: 3, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 86 - fields: {title: New Avengers, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 87 - fields: {title: New Mutants, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 88 - fields: {title: New X-Men, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 89 - fields: {title: New X-Men Academy X, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 90 - fields: {title: New X-Men Hellions, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 91 - fields: {title: Nightcrawler, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 92 - fields: {title: 'Ororo: Before the Storm', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 93 - fields: {title: Radix, publisher: 4, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 94 - fields: {title: Red Sonja, publisher: 15, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 95 - fields: {title: Revelations, publisher: 13, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 96 - fields: {title: Rogue, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 97 - fields: {title: Ruse, publisher: 3, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 98 - fields: {title: 'Samurai: Heaven & Earth', publisher: 13, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 99 - fields: {title: Scion, publisher: 3, current_order: false, completed: false, writer: 1, - artist: null} -- model: comics.comic - pk: 100 - fields: {title: 'Shanna, The She-Devil', publisher: 10, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 101 - fields: {title: She-Hulk, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 102 - fields: {title: She-Hulk 2, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 103 - fields: {title: Shi Ju-Nen, publisher: 13, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 104 - fields: {title: Shrek, publisher: 13, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 105 - fields: {title: Simpsons, publisher: 7, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 106 - fields: {title: Sojourn, publisher: 3, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 107 - fields: {title: Solus, publisher: 3, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 108 - fields: {title: Soulfire, publisher: 6, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 109 - fields: {title: Soulfire Dying of the Light, publisher: 6, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 110 - fields: {title: Spectacular Spider-Man, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 111 - fields: {title: Spellbinders, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 112 - fields: {title: Spider-Man India, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 113 - fields: {title: Spider-Man loves Mary Jane, publisher: 1, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 114 - fields: {title: Spider-Man Team Up, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 115 - fields: {title: 'Spider-Man: Breakout', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 116 - fields: {title: 'Spider-Man: House of M', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 117 - fields: {title: Star Wars, publisher: 13, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 118 - fields: {title: Stardust Kid, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 119 - fields: {title: Strange, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 120 - fields: {title: Supergirl, publisher: 9, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 121 - fields: {title: Superman, publisher: 9, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 122 - fields: {title: Superman/Batman, publisher: 9, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 123 - fields: {title: Tarot Witch of the Black Rose, publisher: 14, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 124 - fields: {title: The Art of Greg Horn, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 125 - fields: {title: The Devil's Keeper, publisher: 2, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 126 - fields: {title: The Tenth, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 127 - fields: {title: The Tomb of Dracula, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 128 - fields: {title: 'Robert Jordan''s The Wheel of Time: New Spring', publisher: 16, - current_order: false, completed: false, writer: null, artist: null} -- model: comics.comic - pk: 129 - fields: {title: 'Thor: Son of Asgard', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 130 - fields: {title: Tom Strong, publisher: 11, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 131 - fields: {title: Tomb Raider, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 132 - fields: {title: 'Tomb Raider: The Greatest Treasure of All', publisher: 4, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 133 - fields: {title: Toxin, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 134 - fields: {title: Ultimate Fantastic Four, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 135 - fields: {title: Ultimate Spider-Man Annual, publisher: 1, current_order: false, - completed: false, writer: 1, artist: null} -- model: comics.comic - pk: 136 - fields: {title: Uncanny X-Men, publisher: 1, current_order: false, completed: false, - writer: 1, artist: null} -- model: comics.comic - pk: 137 - fields: {title: Vampirella, publisher: 15, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 138 - fields: {title: Wild Girl, publisher: 11, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 139 - fields: {title: 'Wildcats: Nemesis', publisher: 11, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 140 - fields: {title: Wildsiderz, publisher: 11, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 141 - fields: {title: Witchblade, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 142 - fields: {title: Witchblade / Tomb Raider, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 143 - fields: {title: 'Wolverine: The End', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 144 - fields: {title: Wood Boy, publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 145 - fields: {title: Wraithborn, publisher: 11, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 146 - fields: {title: X-23, publisher: 1, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 147 - fields: {title: 'X-Men: Age of Apocalypse', publisher: 1, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 148 - fields: {title: 'X-Men: Age of Apocalypse One Shot', publisher: 1, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 149 - fields: {title: 'X-Men: Kitty Pryde', publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 150 - fields: {title: 'X-Men: Phoenix - Endsong', publisher: 1, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 151 - fields: {title: X-treme X-Men, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 152 - fields: {title: Army of Darkness vs. Re-Animator, publisher: 15, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 153 - fields: {title: Runaways, publisher: 1, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 154 - fields: {title: Crux, publisher: 3, current_order: false, completed: false, writer: null, - artist: null} -- model: comics.comic - pk: 155 - fields: {title: 'Aria: The Soul Market', publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 156 - fields: {title: 'Aria: Summer''s Spell', publisher: 4, current_order: false, completed: false, - writer: null, artist: null} -- model: comics.comic - pk: 157 - fields: {title: 'Aria: The Uses of Enchantment', publisher: 4, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 158 - fields: {title: 'Army of Darkness: Ashes 2 Ashes', publisher: 13, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.comic - pk: 159 - fields: {title: 'Army of Darkness: Shop Till You Drop Dead', publisher: 13, current_order: false, - completed: false, writer: null, artist: null} -- model: comics.issue - pk: 1 - fields: {number: '1', is_read: false, in_stock: false, comic: 150, volume: null} -- model: comics.issue - pk: 2 - fields: {number: '2', is_read: false, in_stock: false, comic: 150, volume: null} -- model: comics.issue - pk: 3 - fields: {number: '3', is_read: false, in_stock: false, comic: 150, volume: null} -- model: comics.issue - pk: 4 - fields: {number: '4', is_read: false, in_stock: false, comic: 150, volume: null} -- model: comics.issue - pk: 5 - fields: {number: '5', is_read: false, in_stock: false, comic: 150, volume: null} -- model: comics.issue - pk: 6 - fields: {number: '1', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 7 - fields: {number: '2', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 8 - fields: {number: '3', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 9 - fields: {number: '4', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 10 - fields: {number: '5', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 11 - fields: {number: '6', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 12 - fields: {number: '7', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 13 - fields: {number: '8', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 14 - fields: {number: '9', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 15 - fields: {number: '10', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 16 - fields: {number: '11', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 17 - fields: {number: '12', is_read: true, in_stock: false, comic: 79, volume: null} -- model: comics.issue - pk: 18 - fields: {number: '1', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 19 - fields: {number: '2', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 20 - fields: {number: '3', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 21 - fields: {number: '4', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 22 - fields: {number: '5', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 23 - fields: {number: '6', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 24 - fields: {number: '7', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 25 - fields: {number: '8', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 26 - fields: {number: '9', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 27 - fields: {number: '10', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 28 - fields: {number: '11', is_read: false, in_stock: false, comic: 6, volume: null} -- model: comics.issue - pk: 29 - fields: {number: '1', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 30 - fields: {number: '2', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 31 - fields: {number: '3', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 32 - fields: {number: '4', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 33 - fields: {number: '5', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 34 - fields: {number: '6', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 35 - fields: {number: '7', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 36 - fields: {number: '8', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 37 - fields: {number: '9', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 38 - fields: {number: '10', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 39 - fields: {number: '11', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 40 - fields: {number: '12', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 41 - fields: {number: '13', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 42 - fields: {number: '14', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 43 - fields: {number: '15', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 44 - fields: {number: '16', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 45 - fields: {number: '17', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 46 - fields: {number: '18', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 47 - fields: {number: '19', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 48 - fields: {number: '20', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 49 - fields: {number: '21', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 50 - fields: {number: '22', is_read: false, in_stock: false, comic: 54, volume: null} -- model: comics.issue - pk: 51 - fields: {number: '1', is_read: false, in_stock: false, comic: 55, volume: null} -- model: comics.issue - pk: 52 - fields: {number: '2', is_read: false, in_stock: false, comic: 55, volume: null} -- model: comics.issue - pk: 53 - fields: {number: '1', is_read: false, in_stock: false, comic: 16, volume: null} -- model: comics.issue - pk: 54 - fields: {number: '2', is_read: false, in_stock: false, comic: 16, volume: null} -- model: comics.issue - pk: 55 - fields: {number: '3', is_read: false, in_stock: false, comic: 16, volume: null} -- model: comics.issue - pk: 56 - fields: {number: '11', is_read: false, in_stock: false, comic: 15, volume: null} -- model: comics.issue - pk: 57 - fields: {number: '20', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 58 - fields: {number: '21', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 59 - fields: {number: '22', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 60 - fields: {number: '23', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 61 - fields: {number: '24', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 62 - fields: {number: '25', is_read: false, in_stock: false, comic: 14, volume: null} -- model: comics.issue - pk: 63 - fields: {number: '1', is_read: false, in_stock: false, comic: 11, volume: null} -- model: comics.issue - pk: 64 - fields: {number: '1', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 65 - fields: {number: '2', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 66 - fields: {number: '3', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 67 - fields: {number: '4', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 68 - fields: {number: '5', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 69 - fields: {number: '6', is_read: false, in_stock: false, comic: 12, volume: null} -- model: comics.issue - pk: 70 - fields: {number: '1', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 71 - fields: {number: '2', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 72 - fields: {number: '3', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 73 - fields: {number: '4', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 74 - fields: {number: '5', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 75 - fields: {number: '6', is_read: false, in_stock: false, comic: 18, volume: null} -- model: comics.issue - pk: 76 - fields: {number: '1', is_read: false, in_stock: false, comic: 19, volume: null} -- model: comics.issue - pk: 77 - fields: {number: '2', is_read: false, in_stock: false, comic: 19, volume: null} -- model: comics.issue - pk: 78 - fields: {number: '3', is_read: false, in_stock: false, comic: 19, volume: null} -- model: comics.issue - pk: 79 - fields: {number: '4', is_read: false, in_stock: false, comic: 19, volume: null} -- model: comics.issue - pk: 80 - fields: {number: '5', is_read: false, in_stock: false, comic: 19, volume: null} -- model: comics.issue - pk: 81 - fields: {number: '1', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 82 - fields: {number: '2', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 83 - fields: {number: '3', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 84 - fields: {number: '4', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 85 - fields: {number: '5', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 86 - fields: {number: '6', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 87 - fields: {number: '7', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 88 - fields: {number: '8', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 89 - fields: {number: '9', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 90 - fields: {number: '10', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 91 - fields: {number: '11', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 92 - fields: {number: '12', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 93 - fields: {number: '13', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 94 - fields: {number: '14', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 95 - fields: {number: '15', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 96 - fields: {number: '16', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 97 - fields: {number: '17', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 98 - fields: {number: '18', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 99 - fields: {number: '19', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 100 - fields: {number: '20', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 101 - fields: {number: '21', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 102 - fields: {number: '22', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 103 - fields: {number: '23', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 104 - fields: {number: '24', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 105 - fields: {number: '25', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 106 - fields: {number: '26', is_read: false, in_stock: false, comic: 97, volume: null} -- model: comics.issue - pk: 107 - fields: {number: '1', is_read: false, in_stock: false, comic: 98, volume: null} -- model: comics.issue - pk: 108 - fields: {number: '2', is_read: false, in_stock: false, comic: 98, volume: null} -- model: comics.issue - pk: 109 - fields: {number: '3', is_read: false, in_stock: false, comic: 98, volume: null} -- model: comics.issue - pk: 110 - fields: {number: '4', is_read: false, in_stock: false, comic: 98, volume: null} -- model: comics.issue - pk: 111 - fields: {number: '1', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 112 - fields: {number: '2', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 113 - fields: {number: '3', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 114 - fields: {number: '4', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 115 - fields: {number: '5', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 116 - fields: {number: '6', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 117 - fields: {number: '7', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 118 - fields: {number: '8', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 119 - fields: {number: '9', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 120 - fields: {number: '10', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 121 - fields: {number: '11', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 122 - fields: {number: '12', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 123 - fields: {number: '13', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 124 - fields: {number: '14', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 125 - fields: {number: '15', is_read: false, in_stock: false, comic: 4, volume: null} -- model: comics.issue - pk: 126 - fields: {number: '1', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 127 - fields: {number: '2', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 128 - fields: {number: '3', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 129 - fields: {number: '4', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 130 - fields: {number: '5', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 131 - fields: {number: '6', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 132 - fields: {number: '7', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 133 - fields: {number: '8', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 134 - fields: {number: '9', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 135 - fields: {number: '10', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 136 - fields: {number: '11', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 137 - fields: {number: '12', is_read: false, in_stock: false, comic: 40, volume: null} -- model: comics.issue - pk: 138 - fields: {number: '1', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 139 - fields: {number: '2', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 140 - fields: {number: '3', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 141 - fields: {number: '4', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 142 - fields: {number: '5', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 143 - fields: {number: '6', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 144 - fields: {number: '7', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 145 - fields: {number: '8', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 146 - fields: {number: '9', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 147 - fields: {number: '10', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 148 - fields: {number: '11', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 149 - fields: {number: '12', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 150 - fields: {number: '13', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 151 - fields: {number: '14', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 152 - fields: {number: '15', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 153 - fields: {number: '16', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 154 - fields: {number: '17', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 155 - fields: {number: '18', is_read: false, in_stock: false, comic: 39, volume: null} -- model: comics.issue - pk: 156 - fields: {number: '1', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 157 - fields: {number: '2', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 158 - fields: {number: '3', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 159 - fields: {number: '4', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 160 - fields: {number: '5', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 161 - fields: {number: '6', is_read: false, in_stock: false, comic: 22, volume: null} -- model: comics.issue - pk: 162 - fields: {number: '1', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 163 - fields: {number: '2', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 164 - fields: {number: '3', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 165 - fields: {number: '4', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 166 - fields: {number: '5', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 167 - fields: {number: '6', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 168 - fields: {number: '7', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 169 - fields: {number: '8', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 170 - fields: {number: '9', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 171 - fields: {number: '10', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 172 - fields: {number: '11', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 173 - fields: {number: '12', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 174 - fields: {number: '13', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 175 - fields: {number: '14', is_read: false, in_stock: false, comic: 33, volume: null} -- model: comics.issue - pk: 176 - fields: {number: '1', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 177 - fields: {number: '2', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 178 - fields: {number: '3', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 179 - fields: {number: '4', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 180 - fields: {number: '5', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 181 - fields: {number: '6', is_read: false, in_stock: false, comic: 36, volume: null} -- model: comics.issue - pk: 182 - fields: {number: '1', is_read: false, in_stock: false, comic: 37, volume: null} -- model: comics.issue - pk: 183 - fields: {number: '1', is_read: false, in_stock: false, comic: 38, volume: null} -- model: comics.issue - pk: 184 - fields: {number: '1', is_read: false, in_stock: false, comic: 35, volume: null} -- model: comics.issue - pk: 185 - fields: {number: '1', is_read: false, in_stock: false, comic: 34, volume: null} -- model: comics.issue - pk: 186 - fields: {number: '2', is_read: false, in_stock: false, comic: 34, volume: null} -- model: comics.issue - pk: 187 - fields: {number: '1', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 188 - fields: {number: '2', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 189 - fields: {number: '3', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 190 - fields: {number: '4', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 191 - fields: {number: '5', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 192 - fields: {number: '6', is_read: false, in_stock: false, comic: 56, volume: null} -- model: comics.issue - pk: 193 - fields: {number: '1', is_read: false, in_stock: false, comic: 50, volume: null} -- model: comics.issue - pk: 194 - fields: {number: '2', is_read: false, in_stock: false, comic: 50, volume: null} -- model: comics.issue - pk: 195 - fields: {number: '3', is_read: false, in_stock: false, comic: 50, volume: null} -- model: comics.issue - pk: 196 - fields: {number: '4', is_read: false, in_stock: false, comic: 50, volume: null} -- model: comics.issue - pk: 197 - fields: {number: '1', is_read: false, in_stock: false, comic: 75, volume: null} -- model: comics.issue - pk: 198 - fields: {number: '2', is_read: false, in_stock: false, comic: 75, volume: null} -- model: comics.issue - pk: 199 - fields: {number: '3', is_read: false, in_stock: false, comic: 75, volume: null} -- model: comics.issue - pk: 200 - fields: {number: '4', is_read: false, in_stock: false, comic: 75, volume: null} -- model: comics.issue - pk: 201 - fields: {number: '1', is_read: false, in_stock: false, comic: 76, volume: null} -- model: comics.issue - pk: 202 - fields: {number: '2', is_read: false, in_stock: false, comic: 76, volume: null} -- model: comics.issue - pk: 203 - fields: {number: '3', is_read: false, in_stock: false, comic: 76, volume: null} -- model: comics.issue - pk: 204 - fields: {number: '4', is_read: false, in_stock: false, comic: 76, volume: null} -- model: comics.issue - pk: 205 - fields: {number: '1', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 206 - fields: {number: '2', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 207 - fields: {number: '3', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 208 - fields: {number: '4', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 209 - fields: {number: '5', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 210 - fields: {number: '6', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 211 - fields: {number: '7', is_read: false, in_stock: false, comic: 74, volume: null} -- model: comics.issue - pk: 212 - fields: {number: '1', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 213 - fields: {number: '2', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 214 - fields: {number: '3', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 215 - fields: {number: '4', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 216 - fields: {number: '5', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 217 - fields: {number: '6', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 218 - fields: {number: '7', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 219 - fields: {number: '8', is_read: false, in_stock: false, comic: 77, volume: null} -- model: comics.issue - pk: 220 - fields: {number: '1', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 221 - fields: {number: '2', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 222 - fields: {number: '3', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 223 - fields: {number: '4', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 224 - fields: {number: '5', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 225 - fields: {number: '6', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 226 - fields: {number: '7', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 227 - fields: {number: '8', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 228 - fields: {number: '9', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 229 - fields: {number: '10', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 230 - fields: {number: '11', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 231 - fields: {number: '12', is_read: false, in_stock: false, comic: 91, volume: null} -- model: comics.issue - pk: 232 - fields: {number: '1', is_read: false, in_stock: false, comic: 92, volume: null} -- model: comics.issue - pk: 233 - fields: {number: '1', is_read: false, in_stock: false, comic: 93, volume: null} -- model: comics.issue - pk: 234 - fields: {number: '2', is_read: false, in_stock: false, comic: 93, volume: null} -- model: comics.issue - pk: 235 - fields: {number: '3', is_read: false, in_stock: false, comic: 93, volume: null} -- model: comics.issue - pk: 236 - fields: {number: '1', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 237 - fields: {number: '2', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 238 - fields: {number: '3', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 239 - fields: {number: '4', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 240 - fields: {number: '5', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 241 - fields: {number: '6', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 242 - fields: {number: '7', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 243 - fields: {number: '8', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 244 - fields: {number: '9', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 245 - fields: {number: '10', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 246 - fields: {number: '11', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 247 - fields: {number: '12', is_read: false, in_stock: false, comic: 96, volume: null} -- model: comics.issue - pk: 248 - fields: {number: '1', is_read: false, in_stock: false, comic: 103, volume: null} -- model: comics.issue - pk: 249 - fields: {number: '2', is_read: false, in_stock: false, comic: 103, volume: null} -- model: comics.issue - pk: 250 - fields: {number: '3', is_read: false, in_stock: false, comic: 103, volume: null} -- model: comics.issue - pk: 251 - fields: {number: '4', is_read: false, in_stock: false, comic: 103, volume: null} -- model: comics.issue - pk: 252 - fields: {number: '1', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 253 - fields: {number: '2', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 254 - fields: {number: '3', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 255 - fields: {number: '4', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 256 - fields: {number: '5', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 257 - fields: {number: '6', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 258 - fields: {number: '7', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 259 - fields: {number: '8', is_read: false, in_stock: false, comic: 107, volume: null} -- model: comics.issue - pk: 260 - fields: {number: '1', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 261 - fields: {number: '2', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 262 - fields: {number: '3', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 263 - fields: {number: '4', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 264 - fields: {number: '5', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 265 - fields: {number: '6', is_read: false, in_stock: false, comic: 133, volume: null} -- model: comics.issue - pk: 266 - fields: {number: '1', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 267 - fields: {number: '2', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 268 - fields: {number: '3', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 269 - fields: {number: '4', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 270 - fields: {number: '5', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 271 - fields: {number: '6', is_read: false, in_stock: false, comic: 138, volume: null} -- model: comics.issue - pk: 272 - fields: {number: '1', is_read: false, in_stock: false, comic: 139, volume: null} -- model: comics.issue - pk: 273 - fields: {number: '1', is_read: false, in_stock: false, comic: 140, volume: null} -- model: comics.issue - pk: 274 - fields: {number: '19', is_read: false, in_stock: false, comic: 137, volume: null} -- model: comics.issue - pk: 275 - fields: {number: '1', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 276 - fields: {number: '2', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 277 - fields: {number: '3', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 278 - fields: {number: '4', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 279 - fields: {number: '5', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 280 - fields: {number: '6', is_read: false, in_stock: false, comic: 143, volume: null} -- model: comics.issue - pk: 281 - fields: {number: '1', is_read: false, in_stock: false, comic: 144, volume: null} -- model: comics.issue - pk: 282 - fields: {number: '1', is_read: false, in_stock: false, comic: 145, volume: null} -- model: comics.issue - pk: 283 - fields: {number: '2', is_read: false, in_stock: false, comic: 145, volume: null} -- model: comics.issue - pk: 284 - fields: {number: '3', is_read: false, in_stock: false, comic: 145, volume: null} -- model: comics.issue - pk: 285 - fields: {number: '1', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 286 - fields: {number: '2', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 287 - fields: {number: '3', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 288 - fields: {number: '4', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 289 - fields: {number: '5', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 290 - fields: {number: '6', is_read: false, in_stock: false, comic: 146, volume: null} -- model: comics.issue - pk: 291 - fields: {number: '46', is_read: false, in_stock: false, comic: 151, volume: null} -- model: comics.issue - pk: 292 - fields: {number: '1', is_read: false, in_stock: false, comic: 149, volume: null} -- model: comics.issue - pk: 293 - fields: {number: '2', is_read: false, in_stock: false, comic: 149, volume: null} -- model: comics.issue - pk: 294 - fields: {number: '3', is_read: false, in_stock: false, comic: 149, volume: null} -- model: comics.issue - pk: 295 - fields: {number: '4', is_read: false, in_stock: false, comic: 149, volume: null} -- model: comics.issue - pk: 296 - fields: {number: '5', is_read: false, in_stock: false, comic: 149, volume: null} -- model: comics.issue - pk: 297 - fields: {number: '1', is_read: false, in_stock: false, comic: 142, volume: null} -- model: comics.issue - pk: 298 - fields: {number: '1', is_read: false, in_stock: false, comic: 148, volume: null} -- model: comics.issue - pk: 299 - fields: {number: '1', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 300 - fields: {number: '2', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 301 - fields: {number: '3', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 302 - fields: {number: '4', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 303 - fields: {number: '5', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 304 - fields: {number: '6', is_read: false, in_stock: false, comic: 147, volume: null} -- model: comics.issue - pk: 305 - fields: {number: '1', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 306 - fields: {number: '2', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 307 - fields: {number: '3', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 308 - fields: {number: '4', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 309 - fields: {number: '5', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 310 - fields: {number: '6', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 311 - fields: {number: '7', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 312 - fields: {number: '8', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 313 - fields: {number: '9', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 314 - fields: {number: '10', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 315 - fields: {number: '11', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 316 - fields: {number: '12', is_read: false, in_stock: false, comic: 129, volume: null} -- model: comics.issue - pk: 317 - fields: {number: '1', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 318 - fields: {number: '2', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 319 - fields: {number: '3', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 320 - fields: {number: '4', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 321 - fields: {number: '5', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 322 - fields: {number: '6', is_read: false, in_stock: false, comic: 119, volume: null} -- model: comics.issue - pk: 323 - fields: {number: '0', is_read: false, in_stock: false, comic: 120, volume: null} -- model: comics.issue - pk: 324 - fields: {number: '1', is_read: false, in_stock: false, comic: 120, volume: null} -- model: comics.issue - pk: 325 - fields: {number: '2', is_read: false, in_stock: false, comic: 120, volume: null} -- model: comics.issue - pk: 326 - fields: {number: '3', is_read: false, in_stock: false, comic: 120, volume: null} -- model: comics.issue - pk: 327 - fields: {number: '4', is_read: false, in_stock: false, comic: 120, volume: null} -- model: comics.issue - pk: 328 - fields: {number: '1', is_read: false, in_stock: false, comic: 128, volume: null} -- model: comics.issue - pk: 329 - fields: {number: '2', is_read: false, in_stock: false, comic: 128, volume: null} -- model: comics.issue - pk: 330 - fields: {number: '1', is_read: false, in_stock: false, comic: 118, volume: null} -- model: comics.issue - pk: 331 - fields: {number: '2', is_read: false, in_stock: false, comic: 118, volume: null} -- model: comics.issue - pk: 332 - fields: {number: '3', is_read: false, in_stock: false, comic: 118, volume: null} -- model: comics.issue - pk: 333 - fields: {number: '207', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 334 - fields: {number: '208', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 335 - fields: {number: '209', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 336 - fields: {number: '210', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 337 - fields: {number: '211', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 338 - fields: {number: '212', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 339 - fields: {number: '213', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 340 - fields: {number: '214', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 341 - fields: {number: '215', is_read: false, in_stock: false, comic: 121, volume: null} -- model: comics.issue - pk: 342 - fields: {number: '17', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 343 - fields: {number: '18', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 344 - fields: {number: '19', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 345 - fields: {number: '20', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 346 - fields: {number: '21', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 347 - fields: {number: '22', is_read: false, in_stock: false, comic: 122, volume: null} -- model: comics.issue - pk: 348 - fields: {number: '1', is_read: false, in_stock: false, comic: 132, volume: null} -- model: comics.issue - pk: 349 - fields: {number: '48', is_read: false, in_stock: false, comic: 131, volume: null} -- model: comics.issue - pk: 350 - fields: {number: '49', is_read: false, in_stock: false, comic: 131, volume: null} -- model: comics.issue - pk: 351 - fields: {number: '50', is_read: false, in_stock: false, comic: 131, volume: null} -- model: comics.issue - pk: 352 - fields: {number: '1', is_read: false, in_stock: false, comic: 130, volume: null} -- model: comics.issue - pk: 353 - fields: {number: '1', is_read: false, in_stock: false, comic: 127, volume: null} -- model: comics.issue - pk: 354 - fields: {number: '1', is_read: false, in_stock: false, comic: 126, volume: null} -- model: comics.issue - pk: 355 - fields: {number: '1', is_read: false, in_stock: false, comic: 125, volume: null} -- model: comics.issue - pk: 356 - fields: {number: '1', is_read: false, in_stock: false, comic: 124, volume: null} -- model: comics.issue - pk: 357 - fields: {number: '81', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 358 - fields: {number: '82', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 359 - fields: {number: '83', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 360 - fields: {number: '84', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 361 - fields: {number: '85', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 362 - fields: {number: '86', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 363 - fields: {number: '87', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 364 - fields: {number: '88', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 365 - fields: {number: '89', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 366 - fields: {number: '90', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 367 - fields: {number: '91', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 368 - fields: {number: '92', is_read: false, in_stock: false, comic: 141, volume: null} -- model: comics.issue - pk: 369 - fields: {number: '19', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 370 - fields: {number: '20', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 371 - fields: {number: '21', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 372 - fields: {number: '22', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 373 - fields: {number: '23', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 374 - fields: {number: '24', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 375 - fields: {number: '25', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 376 - fields: {number: '26', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 377 - fields: {number: '27', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 378 - fields: {number: '28', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 379 - fields: {number: '29', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 380 - fields: {number: '30', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 381 - fields: {number: '31', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 382 - fields: {number: '32', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 383 - fields: {number: '33', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 384 - fields: {number: '34', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 385 - fields: {number: '35', is_read: false, in_stock: false, comic: 123, volume: null} -- model: comics.issue - pk: 386 - fields: {number: '1', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 387 - fields: {number: '2', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 388 - fields: {number: '3', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 389 - fields: {number: '4', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 390 - fields: {number: '5', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 391 - fields: {number: '6', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 392 - fields: {number: '7', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 393 - fields: {number: '8', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 394 - fields: {number: '9', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 395 - fields: {number: '10', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 396 - fields: {number: '11', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 397 - fields: {number: '12', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 398 - fields: {number: '13', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 399 - fields: {number: '14', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 400 - fields: {number: '15', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 401 - fields: {number: '16', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 402 - fields: {number: '17', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 403 - fields: {number: '18', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 404 - fields: {number: '19', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 405 - fields: {number: '20', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 406 - fields: {number: '21', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 407 - fields: {number: '22', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 408 - fields: {number: '23', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 409 - fields: {number: '24', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 410 - fields: {number: '25', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 411 - fields: {number: '26', is_read: false, in_stock: false, comic: 110, volume: null} -- model: comics.issue - pk: 412 - fields: {number: '1', is_read: false, in_stock: false, comic: 108, volume: null} -- model: comics.issue - pk: 413 - fields: {number: '2', is_read: false, in_stock: false, comic: 108, volume: null} -- model: comics.issue - pk: 414 - fields: {number: '3', is_read: false, in_stock: false, comic: 108, volume: null} -- model: comics.issue - pk: 415 - fields: {number: '4', is_read: false, in_stock: false, comic: 108, volume: null} -- model: comics.issue - pk: 416 - fields: {number: '5', is_read: false, in_stock: false, comic: 108, volume: null} -- model: comics.issue - pk: 417 - fields: {number: '1', is_read: false, in_stock: false, comic: 109, volume: null} -- model: comics.issue - pk: 418 - fields: {number: '2', is_read: false, in_stock: false, comic: 109, volume: null} -- model: comics.issue - pk: 419 - fields: {number: '3', is_read: false, in_stock: false, comic: 109, volume: null} -- model: comics.issue - pk: 420 - fields: {number: '4', is_read: false, in_stock: false, comic: 109, volume: null} -- model: comics.issue - pk: 421 - fields: {number: '1', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 422 - fields: {number: '2', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 423 - fields: {number: '3', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 424 - fields: {number: '4', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 425 - fields: {number: '5', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 426 - fields: {number: '6', is_read: false, in_stock: false, comic: 111, volume: null} -- model: comics.issue - pk: 427 - fields: {number: '1', is_read: false, in_stock: false, comic: 113, volume: null} -- model: comics.issue - pk: 428 - fields: {number: '1', is_read: false, in_stock: false, comic: 112, volume: null} -- model: comics.issue - pk: 429 - fields: {number: '2', is_read: false, in_stock: false, comic: 112, volume: null} -- model: comics.issue - pk: 430 - fields: {number: '3', is_read: false, in_stock: false, comic: 112, volume: null} -- model: comics.issue - pk: 431 - fields: {number: '4', is_read: false, in_stock: false, comic: 112, volume: null} -- model: comics.issue - pk: 432 - fields: {number: '1', is_read: false, in_stock: false, comic: 114, volume: null} -- model: comics.issue - pk: 433 - fields: {number: '2', is_read: false, in_stock: false, comic: 114, volume: null} -- model: comics.issue - pk: 434 - fields: {number: '3', is_read: false, in_stock: false, comic: 114, volume: null} -- model: comics.issue - pk: 435 - fields: {number: '4', is_read: false, in_stock: false, comic: 114, volume: null} -- model: comics.issue - pk: 436 - fields: {number: '5', is_read: false, in_stock: false, comic: 114, volume: null} -- model: comics.issue - pk: 437 - fields: {number: '1', is_read: false, in_stock: false, comic: 115, volume: null} -- model: comics.issue - pk: 438 - fields: {number: '2', is_read: false, in_stock: false, comic: 115, volume: null} -- model: comics.issue - pk: 439 - fields: {number: '3', is_read: false, in_stock: false, comic: 115, volume: null} -- model: comics.issue - pk: 440 - fields: {number: '4', is_read: false, in_stock: false, comic: 115, volume: null} -- model: comics.issue - pk: 441 - fields: {number: '5', is_read: false, in_stock: false, comic: 115, volume: null} -- model: comics.issue - pk: 442 - fields: {number: '1', is_read: false, in_stock: false, comic: 116, volume: null} -- model: comics.issue - pk: 443 - fields: {number: '2', is_read: false, in_stock: false, comic: 116, volume: null} -- model: comics.issue - pk: 444 - fields: {number: '3', is_read: false, in_stock: false, comic: 116, volume: null} -- model: comics.issue - pk: 445 - fields: {number: '4', is_read: false, in_stock: false, comic: 116, volume: null} -- model: comics.issue - pk: 446 - fields: {number: '13', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 447 - fields: {number: '14', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 448 - fields: {number: '15', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 449 - fields: {number: '16', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 450 - fields: {number: '17', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 451 - fields: {number: '18', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 452 - fields: {number: '19', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 453 - fields: {number: '20', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 454 - fields: {number: '21', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 455 - fields: {number: '22', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 456 - fields: {number: '23', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 457 - fields: {number: '24', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 458 - fields: {number: '25', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 459 - fields: {number: '26', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 460 - fields: {number: '27', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 461 - fields: {number: '28', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 462 - fields: {number: '29', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 463 - fields: {number: '30', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 464 - fields: {number: '31', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 465 - fields: {number: '32', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 466 - fields: {number: '33', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 467 - fields: {number: '34', is_read: false, in_stock: false, comic: 106, volume: null} -- model: comics.issue - pk: 468 - fields: {number: '1', is_read: false, in_stock: false, comic: 104, volume: null} -- model: comics.issue - pk: 469 - fields: {number: '2', is_read: false, in_stock: false, comic: 104, volume: null} -- model: comics.issue - pk: 470 - fields: {number: '1', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 471 - fields: {number: '2', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 472 - fields: {number: '3', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 473 - fields: {number: '4', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 474 - fields: {number: '5', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 475 - fields: {number: '6', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 476 - fields: {number: '7', is_read: false, in_stock: false, comic: 100, volume: null} -- model: comics.issue - pk: 477 - fields: {number: '100', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 478 - fields: {number: '101', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 479 - fields: {number: '102', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 480 - fields: {number: '103', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 481 - fields: {number: '104', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 482 - fields: {number: '105', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 483 - fields: {number: '106', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 484 - fields: {number: '107', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 485 - fields: {number: '108', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 486 - fields: {number: '109', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 487 - fields: {number: '110', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 488 - fields: {number: '111', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 489 - fields: {number: '112', is_read: false, in_stock: false, comic: 105, volume: null} -- model: comics.issue - pk: 490 - fields: {number: '1', is_read: false, in_stock: false, comic: 90, volume: null} -- model: comics.issue - pk: 491 - fields: {number: '2', is_read: false, in_stock: false, comic: 90, volume: null} -- model: comics.issue - pk: 492 - fields: {number: '3', is_read: false, in_stock: false, comic: 90, volume: null} -- model: comics.issue - pk: 493 - fields: {number: '4', is_read: false, in_stock: false, comic: 90, volume: null} -- model: comics.issue - pk: 494 - fields: {number: '1', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 495 - fields: {number: '2', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 496 - fields: {number: '3', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 497 - fields: {number: '4', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 498 - fields: {number: '5', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 499 - fields: {number: '6', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 500 - fields: {number: '7', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 501 - fields: {number: '8', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 502 - fields: {number: '9', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 503 - fields: {number: '10', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 504 - fields: {number: '11', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 505 - fields: {number: '12', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 506 - fields: {number: '13', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 507 - fields: {number: '14', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 508 - fields: {number: '15', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 509 - fields: {number: '16', is_read: false, in_stock: false, comic: 89, volume: null} -- model: comics.issue - pk: 510 - fields: {number: '151', is_read: false, in_stock: false, comic: 88, volume: null} -- model: comics.issue - pk: 511 - fields: {number: '152', is_read: false, in_stock: false, comic: 88, volume: null} -- model: comics.issue - pk: 512 - fields: {number: '153', is_read: false, in_stock: false, comic: 88, volume: null} -- model: comics.issue - pk: 513 - fields: {number: '154', is_read: false, in_stock: false, comic: 88, volume: null} -- model: comics.issue - pk: 514 - fields: {number: '1', is_read: false, in_stock: false, comic: 94, volume: null} -- model: comics.issue - pk: 515 - fields: {number: '2', is_read: false, in_stock: false, comic: 94, volume: null} -- model: comics.issue - pk: 516 - fields: {number: '3', is_read: false, in_stock: false, comic: 94, volume: null} -- model: comics.issue - pk: 517 - fields: {number: '1', is_read: false, in_stock: false, comic: 95, volume: null} -- model: comics.issue - pk: 518 - fields: {number: '2', is_read: false, in_stock: false, comic: 95, volume: null} -- model: comics.issue - pk: 519 - fields: {number: '3', is_read: false, in_stock: false, comic: 95, volume: null} -- model: comics.issue - pk: 520 - fields: {number: '4', is_read: false, in_stock: false, comic: 95, volume: null} -- model: comics.issue - pk: 521 - fields: {number: '1', is_read: false, in_stock: false, comic: 68, volume: null} -- model: comics.issue - pk: 522 - fields: {number: '2', is_read: false, in_stock: false, comic: 68, volume: null} -- model: comics.issue - pk: 523 - fields: {number: '3', is_read: false, in_stock: false, comic: 68, volume: null} -- model: comics.issue - pk: 524 - fields: {number: '4', is_read: false, in_stock: false, comic: 68, volume: null} -- model: comics.issue - pk: 525 - fields: {number: '5', is_read: false, in_stock: false, comic: 68, volume: null} -- model: comics.issue - pk: 526 - fields: {number: '1', is_read: false, in_stock: false, comic: 70, volume: null} -- model: comics.issue - pk: 527 - fields: {number: '2', is_read: false, in_stock: false, comic: 70, volume: null} -- model: comics.issue - pk: 528 - fields: {number: '3', is_read: false, in_stock: false, comic: 70, volume: null} -- model: comics.issue - pk: 529 - fields: {number: '4', is_read: false, in_stock: false, comic: 70, volume: null} -- model: comics.issue - pk: 530 - fields: {number: '1', is_read: false, in_stock: false, comic: 71, volume: null} -- model: comics.issue - pk: 531 - fields: {number: '2', is_read: false, in_stock: false, comic: 71, volume: null} -- model: comics.issue - pk: 532 - fields: {number: '3', is_read: false, in_stock: false, comic: 71, volume: null} -- model: comics.issue - pk: 533 - fields: {number: '1', is_read: false, in_stock: false, comic: 69, volume: null} -- model: comics.issue - pk: 534 - fields: {number: '2', is_read: false, in_stock: false, comic: 69, volume: null} -- model: comics.issue - pk: 535 - fields: {number: '1', is_read: false, in_stock: false, comic: 67, volume: null} -- model: comics.issue - pk: 536 - fields: {number: '2', is_read: false, in_stock: false, comic: 67, volume: null} -- model: comics.issue - pk: 537 - fields: {number: '3', is_read: false, in_stock: false, comic: 67, volume: null} -- model: comics.issue - pk: 538 - fields: {number: '1', is_read: false, in_stock: false, comic: 53, volume: null} -- model: comics.issue - pk: 539 - fields: {number: '2', is_read: false, in_stock: false, comic: 53, volume: null} -- model: comics.issue - pk: 540 - fields: {number: '3', is_read: false, in_stock: false, comic: 53, volume: null} -- model: comics.issue - pk: 541 - fields: {number: '1', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 542 - fields: {number: '2', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 543 - fields: {number: '3', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 544 - fields: {number: '4', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 545 - fields: {number: '5', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 546 - fields: {number: '6', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 547 - fields: {number: '7', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 548 - fields: {number: '8', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 549 - fields: {number: '9', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 550 - fields: {number: '10', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 551 - fields: {number: '11', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 552 - fields: {number: '12', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 553 - fields: {number: '13', is_read: false, in_stock: false, comic: 57, volume: null} -- model: comics.issue - pk: 554 - fields: {number: 1/2, is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 555 - fields: {number: '1', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 556 - fields: {number: '2', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 557 - fields: {number: '3', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 558 - fields: {number: '4', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 559 - fields: {number: '5', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 560 - fields: {number: '6', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 561 - fields: {number: '7', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 562 - fields: {number: '8', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 563 - fields: {number: '9', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 564 - fields: {number: '10', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 565 - fields: {number: '11', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 566 - fields: {number: '12', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 567 - fields: {number: '13', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 568 - fields: {number: '14', is_read: false, in_stock: false, comic: 41, volume: null} -- model: comics.issue - pk: 569 - fields: {number: '1', is_read: false, in_stock: false, comic: 42, volume: null} -- model: comics.issue - pk: 570 - fields: {number: '1', is_read: false, in_stock: false, comic: 43, volume: null} -- model: comics.issue - pk: 571 - fields: {number: '2', is_read: false, in_stock: false, comic: 43, volume: null} -- model: comics.issue - pk: 572 - fields: {number: '3', is_read: false, in_stock: false, comic: 43, volume: null} -- model: comics.issue - pk: 573 - fields: {number: '1', is_read: false, in_stock: false, comic: 44, volume: null} -- model: comics.issue - pk: 574 - fields: {number: '1', is_read: false, in_stock: false, comic: 45, volume: null} -- model: comics.issue - pk: 575 - fields: {number: '2', is_read: false, in_stock: false, comic: 45, volume: null} -- model: comics.issue - pk: 576 - fields: {number: '3', is_read: false, in_stock: false, comic: 45, volume: null} -- model: comics.issue - pk: 577 - fields: {number: '1', is_read: false, in_stock: false, comic: 46, volume: null} -- model: comics.issue - pk: 578 - fields: {number: '1', is_read: false, in_stock: false, comic: 47, volume: null} -- model: comics.issue - pk: 579 - fields: {number: '1', is_read: false, in_stock: false, comic: 48, volume: null} -- model: comics.issue - pk: 580 - fields: {number: '0', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 581 - fields: {number: '1', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 582 - fields: {number: '2', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 583 - fields: {number: '3', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 584 - fields: {number: '4', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 585 - fields: {number: '5', is_read: false, in_stock: false, comic: 49, volume: null} -- model: comics.issue - pk: 586 - fields: {number: '1', is_read: false, in_stock: false, comic: 51, volume: null} -- model: comics.issue - pk: 587 - fields: {number: '1', is_read: false, in_stock: false, comic: 52, volume: null} -- model: comics.issue - pk: 588 - fields: {number: '1', is_read: false, in_stock: false, comic: 27, volume: null} -- model: comics.issue - pk: 589 - fields: {number: '2', is_read: false, in_stock: false, comic: 27, volume: null} -- model: comics.issue - pk: 590 - fields: {number: '3', is_read: false, in_stock: false, comic: 27, volume: null} -- model: comics.issue - pk: 591 - fields: {number: '4', is_read: false, in_stock: false, comic: 27, volume: null} -- model: comics.issue - pk: 592 - fields: {number: '1', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 593 - fields: {number: '2', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 594 - fields: {number: '3', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 595 - fields: {number: '4', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 596 - fields: {number: '5', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 597 - fields: {number: '6', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 598 - fields: {number: '7', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 599 - fields: {number: '8', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 600 - fields: {number: '9', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 601 - fields: {number: '10', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 602 - fields: {number: '11', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 603 - fields: {number: '12', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 604 - fields: {number: '13', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 605 - fields: {number: '14', is_read: false, in_stock: false, comic: 21, volume: null} -- model: comics.issue - pk: 606 - fields: {number: '1', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 607 - fields: {number: '2', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 608 - fields: {number: '3', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 609 - fields: {number: '4', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 610 - fields: {number: '5', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 611 - fields: {number: '6', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 612 - fields: {number: '7', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 613 - fields: {number: '8', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 614 - fields: {number: '9', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 615 - fields: {number: '10', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 616 - fields: {number: '11', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 617 - fields: {number: '12', is_read: false, in_stock: false, comic: 10, volume: null} -- model: comics.issue - pk: 618 - fields: {number: '1', is_read: false, in_stock: false, comic: 13, volume: null} -- model: comics.issue - pk: 619 - fields: {number: '1', is_read: false, in_stock: false, comic: 9, volume: null} -- model: comics.issue - pk: 620 - fields: {number: '2', is_read: false, in_stock: false, comic: 9, volume: null} -- model: comics.issue - pk: 621 - fields: {number: '3', is_read: false, in_stock: false, comic: 9, volume: null} -- model: comics.issue - pk: 622 - fields: {number: '1', is_read: false, in_stock: false, comic: 152, volume: null} -- model: comics.issue - pk: 623 - fields: {number: '2', is_read: false, in_stock: false, comic: 152, volume: null} -- model: comics.issue - pk: 624 - fields: {number: '3', is_read: false, in_stock: false, comic: 152, volume: null} -- model: comics.issue - pk: 625 - fields: {number: '1', is_read: false, in_stock: false, comic: 61, volume: null} -- model: comics.issue - pk: 626 - fields: {number: '2', is_read: false, in_stock: false, comic: 61, volume: null} -- model: comics.issue - pk: 627 - fields: {number: '3', is_read: false, in_stock: false, comic: 61, volume: null} -- model: comics.issue - pk: 628 - fields: {number: '4', is_read: false, in_stock: false, comic: 61, volume: null} -- model: comics.issue - pk: 629 - fields: {number: '1', is_read: false, in_stock: false, comic: 63, volume: null} -- model: comics.issue - pk: 630 - fields: {number: '2', is_read: false, in_stock: false, comic: 63, volume: null} -- model: comics.issue - pk: 631 - fields: {number: '3', is_read: false, in_stock: false, comic: 63, volume: null} -- model: comics.issue - pk: 632 - fields: {number: '0', is_read: false, in_stock: false, comic: 64, volume: null} -- model: comics.issue - pk: 633 - fields: {number: '1', is_read: false, in_stock: false, comic: 64, volume: null} -- model: comics.issue - pk: 634 - fields: {number: '2', is_read: false, in_stock: false, comic: 64, volume: null} -- model: comics.issue - pk: 635 - fields: {number: '3', is_read: false, in_stock: false, comic: 64, volume: null} -- model: comics.issue - pk: 636 - fields: {number: '4', is_read: false, in_stock: false, comic: 64, volume: null} -- model: comics.issue - pk: 637 - fields: {number: '1', is_read: false, in_stock: false, comic: 65, volume: null} -- model: comics.issue - pk: 638 - fields: {number: '1', is_read: false, in_stock: false, comic: 66, volume: null} -- model: comics.issue - pk: 639 - fields: {number: '1', is_read: false, in_stock: false, comic: 72, volume: null} -- model: comics.issue - pk: 640 - fields: {number: '20', is_read: false, in_stock: false, comic: 73, volume: null} -- model: comics.issue - pk: 641 - fields: {number: '39', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 642 - fields: {number: '40', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 643 - fields: {number: '41', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 644 - fields: {number: '42', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 645 - fields: {number: '43', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 646 - fields: {number: '44', is_read: false, in_stock: false, comic: 78, volume: null} -- model: comics.issue - pk: 647 - fields: {number: '1', is_read: false, in_stock: false, comic: 84, volume: null} -- model: comics.issue - pk: 648 - fields: {number: '2', is_read: false, in_stock: false, comic: 84, volume: null} -- model: comics.issue - pk: 649 - fields: {number: '3', is_read: false, in_stock: false, comic: 84, volume: null} -- model: comics.issue - pk: 650 - fields: {number: '1', is_read: false, in_stock: false, comic: 85, volume: null} -- model: comics.issue - pk: 651 - fields: {number: '2', is_read: false, in_stock: false, comic: 85, volume: null} -- model: comics.issue - pk: 652 - fields: {number: '1', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 653 - fields: {number: '2', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 654 - fields: {number: '3', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 655 - fields: {number: '4', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 656 - fields: {number: '5', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 657 - fields: {number: '6', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 658 - fields: {number: '7', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 659 - fields: {number: '8', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 660 - fields: {number: '9', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 661 - fields: {number: '10', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 662 - fields: {number: '11', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 663 - fields: {number: '12', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 664 - fields: {number: '13', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 665 - fields: {number: '14', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 666 - fields: {number: '15', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 667 - fields: {number: '16', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 668 - fields: {number: '17', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 669 - fields: {number: '18', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 670 - fields: {number: '19', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 671 - fields: {number: '20', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 672 - fields: {number: '21', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 673 - fields: {number: '22', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 674 - fields: {number: '23', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 675 - fields: {number: '24', is_read: false, in_stock: false, comic: 83, volume: null} -- model: comics.issue - pk: 676 - fields: {number: '1', is_read: false, in_stock: false, comic: 3, volume: null} -- model: comics.issue - pk: 677 - fields: {number: '2', is_read: false, in_stock: false, comic: 3, volume: null} -- model: comics.issue - pk: 678 - fields: {number: '3', is_read: false, in_stock: false, comic: 3, volume: null} -- model: comics.issue - pk: 679 - fields: {number: '503', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 680 - fields: {number: '504', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 681 - fields: {number: '505', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 682 - fields: {number: '506', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 683 - fields: {number: '507', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 684 - fields: {number: '508', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 685 - fields: {number: '509', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 686 - fields: {number: '510', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 687 - fields: {number: '511', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 688 - fields: {number: '512', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 689 - fields: {number: '513', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 690 - fields: {number: '514', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 691 - fields: {number: '515', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 692 - fields: {number: '516', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 693 - fields: {number: '517', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 694 - fields: {number: '518', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 695 - fields: {number: '519', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 696 - fields: {number: '520', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 697 - fields: {number: '521', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 698 - fields: {number: '522', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 699 - fields: {number: '523', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 700 - fields: {number: '524', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 701 - fields: {number: '525', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 702 - fields: {number: '526', is_read: false, in_stock: false, comic: 5, volume: null} -- model: comics.issue - pk: 703 - fields: {number: '1', is_read: false, in_stock: false, comic: 26, volume: null} -- model: comics.issue - pk: 704 - fields: {number: '2', is_read: false, in_stock: false, comic: 26, volume: null} -- model: comics.issue - pk: 705 - fields: {number: '1', is_read: false, in_stock: false, comic: 28, volume: null} -- model: comics.issue - pk: 706 - fields: {number: '2', is_read: false, in_stock: false, comic: 28, volume: null} -- model: comics.issue - pk: 707 - fields: {number: '1', is_read: false, in_stock: false, comic: 29, volume: null} -- model: comics.issue - pk: 708 - fields: {number: '1', is_read: false, in_stock: false, comic: 30, volume: null} -- model: comics.issue - pk: 709 - fields: {number: '1', is_read: false, in_stock: false, comic: 31, volume: null} -- model: comics.issue - pk: 710 - fields: {number: '17', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 711 - fields: {number: '18', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 712 - fields: {number: '19', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 713 - fields: {number: '20', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 714 - fields: {number: '21', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 715 - fields: {number: '22', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 716 - fields: {number: '23', is_read: false, in_stock: false, comic: 32, volume: null} -- model: comics.issue - pk: 717 - fields: {number: '1', is_read: false, in_stock: false, comic: 7, volume: null} -- model: comics.issue - pk: 718 - fields: {number: '2', is_read: false, in_stock: false, comic: 7, volume: null} -- model: comics.issue - pk: 719 - fields: {number: '3', is_read: false, in_stock: false, comic: 7, volume: null} -- model: comics.issue - pk: 720 - fields: {number: '4', is_read: false, in_stock: false, comic: 7, volume: null} -- model: comics.issue - pk: 721 - fields: {number: '1', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 722 - fields: {number: '2', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 723 - fields: {number: '3', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 724 - fields: {number: '4', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 725 - fields: {number: '5', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 726 - fields: {number: '6', is_read: false, in_stock: false, comic: 155, volume: null} -- model: comics.issue - pk: 727 - fields: {number: '1', is_read: false, in_stock: false, comic: 156, volume: null} -- model: comics.issue - pk: 728 - fields: {number: '2', is_read: false, in_stock: false, comic: 156, volume: null} -- model: comics.issue - pk: 729 - fields: {number: '1', is_read: false, in_stock: false, comic: 157, volume: null} -- model: comics.issue - pk: 730 - fields: {number: '2', is_read: false, in_stock: false, comic: 157, volume: null} -- model: comics.issue - pk: 731 - fields: {number: '3', is_read: false, in_stock: false, comic: 157, volume: null} -- model: comics.issue - pk: 732 - fields: {number: '4', is_read: false, in_stock: false, comic: 157, volume: null} -- model: comics.issue - pk: 733 - fields: {number: '1', is_read: false, in_stock: false, comic: 158, volume: null} -- model: comics.issue - pk: 734 - fields: {number: '2', is_read: false, in_stock: false, comic: 158, volume: null} -- model: comics.issue - pk: 735 - fields: {number: '3', is_read: false, in_stock: false, comic: 158, volume: null} -- model: comics.issue - pk: 736 - fields: {number: '4', is_read: false, in_stock: false, comic: 158, volume: null} -- model: comics.issue - pk: 737 - fields: {number: '1', is_read: false, in_stock: false, comic: 159, volume: null} -- model: comics.issue - pk: 738 - fields: {number: '2', is_read: false, in_stock: false, comic: 159, volume: null} -- model: comics.issue - pk: 739 - fields: {number: '1', is_read: false, in_stock: false, comic: 58, volume: null} -- model: comics.issue - pk: 740 - fields: {number: '2', is_read: false, in_stock: false, comic: 58, volume: null} -- model: comics.issue - pk: 741 - fields: {number: '1', is_read: false, in_stock: false, comic: 60, volume: null} -- model: comics.storyarc - pk: 1 - fields: {name: Higher Learning, comic: 39} -- model: comics.storyarc - pk: 2 - fields: {name: Mind Games, comic: 39} -- model: comics.storyarc - pk: 3 - fields: {name: Bloom, comic: 39} -- model: comics.tradepaperback - pk: 1 - fields: {name: Vol. 1, comic: 79, issue_start: 1, issue_end: 12} -- model: comics.tradepaperback - pk: 2 - fields: {name: From The Ashes, comic: 106, issue_start: 1, issue_end: 6} -- model: comics.tradepaperback - pk: 3 - fields: {name: The Dragons Tale, comic: 106, issue_start: 7, issue_end: 12} -- model: comics.tradepaperback - pk: 4 - fields: {name: The Warriors Tale, comic: 106, issue_start: 13, issue_end: 18} -- model: comics.tradepaperback - pk: 5 - fields: {name: The Thiefs Tale, comic: 106, issue_start: 19, issue_end: 24} -- model: comics.tradepaperback - pk: 6 - fields: {name: Vol. 1, comic: 153, issue_start: 1, issue_end: 18} -- model: comics.tradepaperback - pk: 7 - fields: {name: Choices, comic: 57, issue_start: 1, issue_end: 5} -- model: comics.tradepaperback - pk: 8 - fields: {name: Atlantis Rising, comic: 154, issue_start: 1, issue_end: 6} -- model: comics.tradepaperback - pk: 9 - fields: {name: Test Of Time, comic: 154, issue_start: 7, issue_end: 12} -- model: comics.tradepaperback - pk: 10 - fields: {name: Strangers in Atlantis, comic: 154, issue_start: 13, issue_end: 18} -- model: comics.tradepaperback - pk: 11 - fields: {name: Flying Solo, comic: 78, issue_start: 1, issue_end: 7} -- model: comics.tradepaperback - pk: 12 - fields: {name: Going To Ground, comic: 78, issue_start: 8, issue_end: 14} -- model: comics.tradepaperback - pk: 13 - fields: {name: Taking The Skies, comic: 78, issue_start: 15, issue_end: 20} -- model: comics.tradepaperback - pk: 14 - fields: {name: Coming Home, comic: 78, issue_start: 21, issue_end: 26} -- model: comics.tradepaperback - pk: 15 - fields: {name: Rite of Passage, comic: 82, issue_start: 1, issue_end: 7} -- model: comics.tradepaperback - pk: 16 - fields: {name: The Demon Queen, comic: 82, issue_start: 8, issue_end: 14} -- model: comics.tradepaperback - pk: 17 - fields: {name: Siege of Scales, comic: 82, issue_start: 15, issue_end: 20} -- model: comics.tradepaperback - pk: 18 - fields: {name: Out All Night, comic: 82, issue_start: 21, issue_end: 26} -- model: comics.tradepaperback - pk: 19 - fields: {name: Single Green Female, comic: 101, issue_start: 1, issue_end: 6} -- model: comics.tradepaperback - pk: 20 - fields: {name: Superhuman Law, comic: 101, issue_start: 7, issue_end: 12} -- model: comics.tradepaperback - pk: 21 - fields: {name: Conflict of Conscience, comic: 99, issue_start: 1, issue_end: 7} -- model: comics.tradepaperback - pk: 22 - fields: {name: Blood For Blood, comic: 99, issue_start: 8, issue_end: 14} -- model: comics.tradepaperback - pk: 23 - fields: {name: Divided Loyalties, comic: 99, issue_start: 15, issue_end: 21} -- model: comics.tradepaperback - pk: 24 - fields: {name: Sanctuary, comic: 99, issue_start: 22, issue_end: 27} -- model: comics.tradepaperback - pk: 25 - fields: {name: The End Of History, comic: 136, issue_start: 444, issue_end: 449} -- model: comics.tradepaperback - pk: 26 - fields: {name: Public Enemies, comic: 122, issue_start: 1, issue_end: 6} -- model: comics.tradepaperback - pk: 27 - fields: {name: Loyalty And Loss, comic: 23, issue_start: 1, issue_end: 6} -- model: comics.tradepaperback - pk: 28 - fields: {name: Heaven & Earth, comic: 23, issue_start: 7, issue_end: 12} -- model: comics.tradepaperback - pk: 29 - fields: {name: Earth Angel, comic: 23, issue_start: 13, issue_end: 18} -- model: comics.tradepaperback - pk: 30 - fields: {name: Redemption, comic: 23, issue_start: 19, issue_end: 24} -- model: comics.tradepaperback - pk: 31 - fields: {name: '1602', comic: 1, issue_start: 1, issue_end: 8} -- model: comics.tradepaperback - pk: 32 - fields: {name: Coming Home, comic: 5, issue_start: 30, issue_end: 35} -- model: comics.tradepaperback - pk: 33 - fields: {name: Revelations, comic: 5, issue_start: 36, issue_end: 39} -- model: comics.tradepaperback - pk: 34 - fields: {name: Until the Stars Turn Cold, comic: 5, issue_start: 40, issue_end: 45} -- model: comics.tradepaperback - pk: 35 - fields: {name: The Life & Death of Spiders, comic: 5, issue_start: 46, issue_end: 50} -- model: comics.tradepaperback - pk: 36 - fields: {name: Unintended Consequences, comic: 5, issue_start: 51, issue_end: 56} -- model: comics.tradepaperback - pk: 37 - fields: {name: Happy Birthday, comic: 5, issue_start: 500, issue_end: 502} -- model: comics.tradepaperback - pk: 38 - fields: {name: Sonderband 1, comic: 25, issue_start: 1, issue_end: 2} -- model: comics.tradepaperback - pk: 39 - fields: {name: Of Like Minds, comic: 17, issue_start: 56, issue_end: 61} -- model: comics.tradepaperback - pk: 40 - fields: {name: Sensei & Student, comic: 17, issue_start: 62, issue_end: 68} diff --git a/django/kontor/comics/migrations/0001_initial.py b/django/kontor/comics/migrations/0001_initial.py deleted file mode 100644 index fa40cd2..0000000 --- a/django/kontor/comics/migrations/0001_initial.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -<<<<<<< HEAD -# Generated by Django 1.9.6 on 2016-06-13 15:33 -======= -# Generated by Django 1.9.5 on 2016-04-10 20:23 ->>>>>>> ignore compiled scripts -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Artist', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='Comic', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=40)), - ('current_order', models.BooleanField()), - ('completed', models.BooleanField()), -<<<<<<< HEAD - ('artist', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='artist', to='comics.Artist')), -======= ->>>>>>> ignore compiled scripts - ], - ), - migrations.CreateModel( - name='Issue', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('number', models.CharField(max_length=4)), - ('is_read', models.BooleanField(default=False)), - ('in_stock', models.BooleanField(default=False)), - ('comic', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='comics.Comic')), - ], - ), - migrations.CreateModel( - name='Publisher', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ], - ), - migrations.CreateModel( - name='StoryArc', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100)), - ('comic', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='comics.Comic')), - ], - ), - migrations.CreateModel( - name='TradePaperback', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ('issue_start', models.IntegerField()), - ('issue_end', models.IntegerField()), - ('comic', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='comics.Comic')), - ], - ), - migrations.CreateModel( - name='Volume', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ('comic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='comics.Comic')), - ], - ), - migrations.AddField( -<<<<<<< HEAD - model_name='issue', - name='volume', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='comics.Volume'), - ), - migrations.AddField( -======= ->>>>>>> ignore compiled scripts - model_name='comic', - name='publisher', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='comics.Publisher'), - ), -<<<<<<< HEAD - migrations.AddField( - model_name='comic', - name='writer', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='writer', to='comics.Artist'), - ), -======= ->>>>>>> ignore compiled scripts - ] diff --git a/django/kontor/comics/migrations/0002_auto_20160620_1405.py b/django/kontor/comics/migrations/0002_auto_20160620_1405.py deleted file mode 100644 index 8bec639..0000000 --- a/django/kontor/comics/migrations/0002_auto_20160620_1405.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-20 14:05 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('comics', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='comic', - name='artist', - field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='artist', to='comics.Artist'), - ), - migrations.AlterField( - model_name='comic', - name='writer', - field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='writer', to='comics.Artist'), - ), - ] diff --git a/django/kontor/comics/migrations/0003_auto_20160620_1410.py b/django/kontor/comics/migrations/0003_auto_20160620_1410.py deleted file mode 100644 index bf0d181..0000000 --- a/django/kontor/comics/migrations/0003_auto_20160620_1410.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-20 14:10 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('comics', '0002_auto_20160620_1405'), - ] - - operations = [ - migrations.AlterField( - model_name='comic', - name='artist', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='artist', to='comics.Artist'), - ), - migrations.AlterField( - model_name='comic', - name='writer', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='writer', to='comics.Artist'), - ), - ] diff --git a/django/kontor/comics/migrations/0004_auto_20160622_1122.py b/django/kontor/comics/migrations/0004_auto_20160622_1122.py deleted file mode 100644 index f9d7312..0000000 --- a/django/kontor/comics/migrations/0004_auto_20160622_1122.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-22 11:22 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('comics', '0003_auto_20160620_1410'), - ] - - operations = [ - migrations.AlterField( - model_name='issue', - name='volume', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comics.Volume'), - ), - ] diff --git a/django/kontor/comics/migrations/0005_auto_20160622_1146.py b/django/kontor/comics/migrations/0005_auto_20160622_1146.py deleted file mode 100644 index d7cae42..0000000 --- a/django/kontor/comics/migrations/0005_auto_20160622_1146.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-22 11:46 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('comics', '0004_auto_20160622_1122'), - ] - - operations = [ - migrations.AlterField( - model_name='comic', - name='title', - field=models.CharField(max_length=60), - ), - ] diff --git a/django/kontor/comics/models.py b/django/kontor/comics/models.py deleted file mode 100755 index 5e55d5f..0000000 --- a/django/kontor/comics/models.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import unicode_literals - -from django.db import models - -# Create your models here. -<<<<<<< HEAD -<<<<<<< HEAD - -======= ->>>>>>> add Comic models - - -class Publisher(models.Model): - name = models.CharField(max_length=100) - - def __str__(self): - return self.name - - -class Artist(models.Model): - name = models.CharField(max_length=100) - - def __str__(self): - return self.name - - -class Comic(models.Model): -<<<<<<< HEAD - title = models.CharField(max_length=60) - publisher = models.ForeignKey(Publisher) - current_order = models.BooleanField() - completed = models.BooleanField() - writer = models.ForeignKey(Artist, blank=True, null=True, related_name='writer') - artist = models.ForeignKey(Artist, blank=True, null=True, related_name='artist') -======= - title = models.CharField(max_length=40) - publisher = models.ForeignKey(Publisher) - current_order = models.BooleanField() - completed = models.BooleanField() -<<<<<<< HEAD ->>>>>>> add Comic models -======= - writer = models.ForeignKey(Artist, null=True, related_name='writer') - artist = models.ForeignKey(Artist, null=True, related_name='artist') ->>>>>>> backup - - def __str__(self): - return self.title - - -class Volume(models.Model): - name = models.CharField(max_length=40) - comic = models.ForeignKey(Comic) - - def __str__(self): - return self.comic.title + ' ' + self.name - - -class Issue(models.Model): - number = models.CharField(max_length=4) - is_read = models.BooleanField(default=False) - in_stock = models.BooleanField(default=False) - comic = models.ForeignKey(Comic, null=True) -<<<<<<< HEAD -<<<<<<< HEAD - volume = models.ForeignKey(Volume, blank=True, null=True) -======= ->>>>>>> add Comic models -======= - volume = models.ForeignKey(Volume, null=True) ->>>>>>> backup - - def __str__(self): - return self.comic.title + ' #' + self.number - - -class StoryArc(models.Model): - name = models.CharField(max_length=100) - comic = models.ForeignKey(Comic, null=True) - - def __str__(self): - return self.name - - -class TradePaperback(models.Model): - name = models.CharField(max_length=40) - comic = models.ForeignKey(Comic, null=True) - issue_start = models.IntegerField() - issue_end = models.IntegerField() - - def __str__(self): -<<<<<<< HEAD - return self.comic.title + ' TP ' + self.name -<<<<<<< HEAD -======= ->>>>>>> initial setup -======= ->>>>>>> add Comic models -======= - return self.comic.title + ' TP ' + self.name ->>>>>>> backup diff --git a/django/kontor/comics/static/comics/style.css b/django/kontor/comics/static/comics/style.css deleted file mode 100644 index bb3a4cd..0000000 --- a/django/kontor/comics/static/comics/style.css +++ /dev/null @@ -1,6 +0,0 @@ -li a { - color: green; -} -td a { - color: green; -} diff --git a/django/kontor/comics/templates/comics/detail.html b/django/kontor/comics/templates/comics/detail.html deleted file mode 100755 index dc11ccd..0000000 --- a/django/kontor/comics/templates/comics/detail.html +++ /dev/null @@ -1,28 +0,0 @@ -<<<<<<< HEAD -{% extends "kontor/base.html" %} -{% block title %}Comic Details{% endblock %} -{% block content %} -======= - - - - - Comic Details - - ->>>>>>> backup - - - - - - - -
Namecurrent Ordercompleted
{{ comic.title }}{{ comic.current_order }}{{ comic.completed }}
-<<<<<<< HEAD -{% endblock %} -======= - - - ->>>>>>> backup diff --git a/django/kontor/comics/templates/comics/index.html b/django/kontor/comics/templates/comics/index.html deleted file mode 100755 index 4a821e8..0000000 --- a/django/kontor/comics/templates/comics/index.html +++ /dev/null @@ -1,34 +0,0 @@ -<<<<<<< HEAD -{% extends "kontor/base.html" %} -{% block title %}Comic Overview{% endblock %} -{% block content %} -======= -{% load staticfiles %} - - - - - - - - - Comic Overview - - ->>>>>>> backup - - - {% for comic in comic_list %} - - - - - - {% endfor %} -
Namecurrent Ordercompleted
{{ comic.title }}{{ comic.current_order }}{{ comic.completed }}
-<<<<<<< HEAD -{% endblock %} -======= - - ->>>>>>> backup diff --git a/django/kontor/comics/tests.py b/django/kontor/comics/tests.py deleted file mode 100644 index 3187d6f..0000000 --- a/django/kontor/comics/tests.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.test import TestCase - -# Create your tests here. - -class ComicsViewsTestCase(TestCase): - def test_index(self): - resp = self.client.get('/comics/') - self.assertEqual(resp.status_code, 200) diff --git a/django/kontor/comics/urls.py b/django/kontor/comics/urls.py deleted file mode 100644 index c16537f..0000000 --- a/django/kontor/comics/urls.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.conf.urls import url - -from . import views - -app_name = 'comics' -urlpatterns = [ - url(r'^$', views.IndexView.as_view(), name='index'), - url(r'^(?P[0-9]+)/$', views.DetailView.as_view(), name='detail'), -] - diff --git a/django/kontor/comics/views.py b/django/kontor/comics/views.py deleted file mode 100644 index 5bb5086..0000000 --- a/django/kontor/comics/views.py +++ /dev/null @@ -1,51 +0,0 @@ -<<<<<<< HEAD -from django.shortcuts import render -<<<<<<< HEAD -from django.http import HttpResponseRedirect -from django.core.urlresolvers import reverse -from django.views import generic - -from .models import Comic -# Create your views here. - - -class IndexView(generic.ListView): - template_name = 'comics/index.html' - context_object_name = 'comic_list' - - def get_queryset(self): - """Return the list of comics.""" - return Comic.objects.all() - - -class DetailView(generic.DetailView): - model = Comic - template_name = 'comics/detail.html' -======= -======= -from django.shortcuts import get_object_or_404, render -from django.http import HttpResponseRedirect -from django.core.urlresolvers import reverse -from django.views import generic ->>>>>>> backup - -from .models import Comic -# Create your views here. -<<<<<<< HEAD ->>>>>>> initial setup -======= - - -class IndexView(generic.ListView): - template_name = 'comics/index.html' - context_object_name = 'comic_list' - - def get_queryset(self): - """Return the list of comics.""" - return Comic.objects.all() - - -class DetailView(generic.DetailView): - model = Comic - template_name = 'comics/detail.html' ->>>>>>> backup diff --git a/django/kontor/homeoffice/admin.py b/django/kontor/homeoffice/admin.py deleted file mode 100755 index b97a94f..0000000 --- a/django/kontor/homeoffice/admin.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Register your models here. diff --git a/django/kontor/homeoffice/apps.py b/django/kontor/homeoffice/apps.py deleted file mode 100755 index d7e7e57..0000000 --- a/django/kontor/homeoffice/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class HomeOfficeConfig(AppConfig): - name = 'homeoffice' diff --git a/django/kontor/homeoffice/migrations/0001_initial.py b/django/kontor/homeoffice/migrations/0001_initial.py deleted file mode 100644 index 073e71b..0000000 --- a/django/kontor/homeoffice/migrations/0001_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-20 16:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Expense', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - migrations.CreateModel( - name='Travel', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - ] diff --git a/django/kontor/homeoffice/models.py b/django/kontor/homeoffice/models.py deleted file mode 100755 index ebe8ae9..0000000 --- a/django/kontor/homeoffice/models.py +++ /dev/null @@ -1,10 +0,0 @@ -from __future__ import unicode_literals - -from django.db import models - -# Create your models here. -class Travel(models.Model): - pass - -class Expense(models.Model): - pass diff --git a/django/kontor/homeoffice/templates/homeoffice/index.html b/django/kontor/homeoffice/templates/homeoffice/index.html deleted file mode 100755 index 5c9a259..0000000 --- a/django/kontor/homeoffice/templates/homeoffice/index.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "kontor/base.html" %} -{% block title %}HomeOffice{% endblock %} diff --git a/django/kontor/homeoffice/tests.py b/django/kontor/homeoffice/tests.py deleted file mode 100755 index 4929020..0000000 --- a/django/kontor/homeoffice/tests.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Create your tests here. diff --git a/django/kontor/homeoffice/urls.py b/django/kontor/homeoffice/urls.py deleted file mode 100755 index 0c7cd34..0000000 --- a/django/kontor/homeoffice/urls.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf.urls import url - -from . import views - -app_name = 'homeoffice' -urlpatterns = [ - url(r'^$', views.index, name='index'), -] diff --git a/django/kontor/homeoffice/views.py b/django/kontor/homeoffice/views.py deleted file mode 100755 index a0b0185..0000000 --- a/django/kontor/homeoffice/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.shortcuts import render - -# Create your views here. -def index(request): - return render(request, 'homeoffice/index.html') diff --git a/django/kontor/kontor/settings.py b/django/kontor/kontor/settings.py deleted file mode 100755 index 0bcce73..0000000 --- a/django/kontor/kontor/settings.py +++ /dev/null @@ -1,166 +0,0 @@ -""" -Django settings for kontor project. - -<<<<<<< HEAD -<<<<<<< HEAD -Generated by 'django-admin startproject' using Django 1.9.6. -======= -Generated by 'django-admin startproject' using Django 1.9.5. ->>>>>>> initial setup - -======= ->>>>>>> backup -For more information on this file, see -https://docs.djangoproject.com/en/1.6/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.6/ref/settings/ -""" - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -import os -BASE_DIR = os.path.dirname(os.path.dirname(__file__)) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -<<<<<<< HEAD -<<<<<<< HEAD -SECRET_KEY = '8s-(!r%0yu)b(hdkes_v#g8kp7)0ma851j+&43cds#duk!s-_c' -======= -SECRET_KEY = 'c)&86w07k)091bgi1llt+aol5$8in8g=n#+iba4784cdw$#h)^' ->>>>>>> initial setup -======= -SECRET_KEY = 'i5qx(%mex)4ovh#y4m94b1(3xiw4%8+rx-!kpw9v4q*@0v6pd2' ->>>>>>> backup - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -TEMPLATE_DEBUG = True - -ALLOWED_HOSTS = [] - - -# Application definition - -<<<<<<< HEAD -INSTALLED_APPS = [ -<<<<<<< HEAD -<<<<<<< HEAD - 'comics.apps.ComicsConfig', - 'library.apps.LibraryConfig', - 'tysc.apps.TyscConfig', - 'tradingcards.apps.TradingCardsConfig', - 'homeoffice.apps.HomeOfficeConfig', - 'medien.apps.MedienConfig', -======= ->>>>>>> initial setup -======= - 'comics.apps.ComicsConfig', ->>>>>>> add admin site for Comics -======= -INSTALLED_APPS = ( - 'comics.apps.ComicsConfig', - 'tysc.apps.TyscConfig', - 'library.apps.LibraryConfig', ->>>>>>> backup - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', -) - -MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -) - -ROOT_URLCONF = 'kontor.urls' - -<<<<<<< HEAD -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', -<<<<<<< HEAD - 'DIRS': [os.path.join(BASE_DIR, 'templates')], -======= - 'DIRS': [], ->>>>>>> initial setup - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', -<<<<<<< HEAD - 'django.template.context_processors.i18n', - 'django.template.context_processors.media', - 'django.template.context_processors.static', - 'django.template.context_processors.tz', -======= ->>>>>>> initial setup - ], - }, - }, -] - -======= ->>>>>>> backup -WSGI_APPLICATION = 'kontor.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/1.6/ref/settings/#databases - -DATABASES = { - 'default': { -# 'ENGINE': 'django.db.backends.dummy', - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} - -#from mongoengine import connect -#connect('kontor') - -#SESSION_ENGINE = 'mongoengine.django.sessions' -#SESSION_SERIALIZER = 'mongoengine.django.sessions.BSONSerializer' - -# Internationalization -# https://docs.djangoproject.com/en/1.6/topics/i18n/ - -<<<<<<< HEAD -LANGUAGE_CODE = 'de-de' -======= -LANGUAGE_CODE = 'en-us' ->>>>>>> initial setup - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.6/howto/static-files/ - -STATIC_URL = '/static/' -<<<<<<< HEAD - -STATICFILES_DIRS = [ - os.path.join(BASE_DIR, "static"), -] -======= ->>>>>>> initial setup diff --git a/django/kontor/kontor/urls.py b/django/kontor/kontor/urls.py deleted file mode 100755 index 043a7e5..0000000 --- a/django/kontor/kontor/urls.py +++ /dev/null @@ -1,61 +0,0 @@ -from django.conf.urls import patterns, include, url - -<<<<<<< HEAD -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.9/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) -""" -<<<<<<< HEAD -from django.conf.urls import url, include -from django.contrib import admin -from django.contrib.auth import views as auth_views - -from . import views - -admin.autodiscover() - -urlpatterns = [ - #url(r'^admin/', admin.site.urls), - url('^', include('django.contrib.auth.urls')), - url(r'^$', views.index, name='index'), - #url(r'^accounts/login/$', auth_views.login), - url(r'^accounts/login/$', auth_views.login, {'template_name': 'kontor/login.html'}), - url(r'^accounts/logout/$', auth_views.logout ), - url(r'^admin/', include(admin.site.urls)), - url(r'^comics/', include('comics.urls')), - url(r'^office/', include('homeoffice.urls')), - url(r'^tradingcards/', include('tradingcards.urls')), - url(r'^tysc/', include('tysc.urls')), - url(r'^library/', include('library.urls')), - url(r'^medien/', include('medien.urls')), -======= -from django.conf.urls import url -======= ->>>>>>> backup -from django.contrib import admin -admin.autodiscover() - -<<<<<<< HEAD -urlpatterns = [ - url(r'^admin/', admin.site.urls), ->>>>>>> initial setup -] -======= -urlpatterns = patterns('', - # Examples: - #url(r'^$', 'kontor.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), - url(r'^comics/', include('comics.urls')), - url(r'^tysc/', include('tysc.urls')), - url(r'^admin/', include(admin.site.urls)), -) ->>>>>>> backup diff --git a/django/kontor/kontor/views.py b/django/kontor/kontor/views.py deleted file mode 100755 index 357acb3..0000000 --- a/django/kontor/kontor/views.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.shortcuts import render -from django.http import HttpResponse - - -def index(request): -<<<<<<< HEAD - return render(request, 'kontor/index.html') -======= - return HttpResponse('You are in the Kontor application') ->>>>>>> backup - - -def home(request): - return HttpResponse('You are in the Kontor application') diff --git a/django/kontor/kontor/wsgi.py b/django/kontor/kontor/wsgi.py deleted file mode 100644 index 3e50929..0000000 --- a/django/kontor/kontor/wsgi.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -WSGI config for kontor project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ -""" - -import os -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kontor.settings") - -from django.core.wsgi import get_wsgi_application -application = get_wsgi_application() diff --git a/django/kontor/library/admin.py b/django/kontor/library/admin.py deleted file mode 100644 index 2359803..0000000 --- a/django/kontor/library/admin.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.contrib import admin - -from .models import Author -from .models import Book -<<<<<<< HEAD -from .models import Category -from .models import Edition -from .models import Publisher -======= ->>>>>>> backup - -# Register your models here. -admin.site.register(Author) -admin.site.register(Book) -<<<<<<< HEAD -admin.site.register(Category) -admin.site.register(Edition) -admin.site.register(Publisher) -======= ->>>>>>> backup diff --git a/django/kontor/library/apps.py b/django/kontor/library/apps.py deleted file mode 100644 index b85578c..0000000 --- a/django/kontor/library/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class LibraryConfig(AppConfig): - name = 'library' diff --git a/django/kontor/library/fixtures/books.yaml b/django/kontor/library/fixtures/books.yaml deleted file mode 100644 index 84d3f1c..0000000 --- a/django/kontor/library/fixtures/books.yaml +++ /dev/null @@ -1,473 +0,0 @@ -- model: library.author - pk: 1 - fields: {name: Terry Pratchett} -- model: library.author - pk: 2 - fields: {name: Colin Forbes} -- model: library.author - pk: 3 - fields: {name: Markus Heitz} -- model: library.author - pk: 4 - fields: {name: Ralf Kuehnel} -- model: library.author - pk: 5 - fields: {name: Richard Murch} -- model: library.author - pk: 6 - fields: {name: Gunter Saake} -- model: library.author - pk: 7 - fields: {name: Kai-Uwe Sattler} -- model: library.author - pk: 8 - fields: {name: Joerg Thadeusz} -- model: library.author - pk: 9 - fields: {name: Stephan Burgdorff} -- model: library.author - pk: 10 - fields: {name: Christian Habbe} -- model: library.author - pk: 11 - fields: {name: Stephen Kenson} -- model: library.author - pk: 12 - fields: {name: Martin Fowler} -- model: library.author - pk: 13 - fields: {name: Ramnivas Laddad} -- model: library.author - pk: 14 - fields: {name: Thomas Gifford} -- model: library.author - pk: 15 - fields: {name: Rene Goscinny} -- model: library.author - pk: 16 - fields: {name: Albert Uderzo} -- model: library.author - pk: 17 - fields: {name: Mel Odem} -- model: library.author - pk: 18 - fields: {name: Harri Assmann} -- model: library.author - pk: 19 - fields: {name: Harald Schmidt} -- model: library.author - pk: 20 - fields: {name: Bruce Tate} -- model: library.author - pk: 21 - fields: {name: Mike Clark} -- model: library.author - pk: 22 - fields: {name: Bob Lee} -- model: library.author - pk: 23 - fields: {name: Patrick Linskey} -- model: library.author - pk: 24 - fields: {name: Jim Knipfel} -- model: library.author - pk: 25 - fields: {name: Carl Sargent} -- model: library.author - pk: 26 - fields: {name: Beate Sauer} -- model: library.author - pk: 27 - fields: {name: Kent Beck} -- model: library.author - pk: 28 - fields: {name: Erich Gamma} -- model: library.author - pk: 29 - fields: {name: Ilko-Sascha Kowalczuk} -- model: library.author - pk: 30 - fields: {name: Dalai Lama} -- model: library.author - pk: 31 - fields: {name: Horst Saecker} -- model: library.author - pk: 32 - fields: {name: Romain Sardou} -- model: library.author - pk: 33 - fields: {name: Berthold Daum} -- model: library.author - pk: 34 - fields: {name: Javier Sierra} -- model: library.author - pk: 35 - fields: {name: Dieter Hesselberger} -- model: library.author - pk: 36 - fields: {name: Anette Baecker} -- model: library.author - pk: 37 - fields: {name: Paul Baecker} -- model: library.author - pk: 38 - fields: {name: Lisa Smedmann} -- model: library.author - pk: 39 - fields: {name: Michael Cordy} -- model: library.author - pk: 40 - fields: {name: Stephen Fry} -- model: library.author - pk: 41 - fields: {name: Jonathan Bond} -- model: library.author - pk: 42 - fields: {name: Vince Flynn} -- model: library.author - pk: 43 - fields: {name: Eric-Emmanuel Schmitt} -- model: library.author - pk: 44 - fields: {name: Jak Koke} -- model: library.author - pk: 45 - fields: {name: Nigel Findley} -- model: library.author - pk: 46 - fields: {name: Edgar Noske} -- model: library.author - pk: 47 - fields: {name: Hannes Wertheim} -- model: library.author - pk: 48 - fields: {name: Frank Schaetzing} -- model: library.author - pk: 49 - fields: {name: Frank Pilz} -- model: library.author - pk: 50 - fields: {name: Frederick Forsyth} -- model: library.author - pk: 51 - fields: {name: Chris Kubasik} -- model: library.author - pk: 52 - fields: {name: Jordan K. Weisman} -- model: library.author - pk: 53 - fields: {name: Hans Georg Lehmann} -- model: library.author - pk: 54 - fields: {name: Nyx Smith} -- model: library.author - pk: 55 - fields: {name: Ferdinand Seibt} -- model: library.author - pk: 56 - fields: {name: Christopher Moore} -- model: library.author - pk: 57 - fields: {name: Jens Gieseke} -- model: library.author - pk: 58 - fields: {name: Bernd Lindner} -- model: library.author - pk: 59 - fields: {name: Horst Poetzsch} -- model: library.author - pk: 60 - fields: {name: Caroline Spector} -- model: library.author - pk: 61 - fields: {name: Peter Godman} -- model: library.author - pk: 62 - fields: {name: Hans Joachim Alpers} -- model: library.author - pk: 63 - fields: {name: Bernhard Schlink} -- model: library.author - pk: 64 - fields: {name: Rebecca Gable} -- model: library.author - pk: 65 - fields: {name: Douglas Adams} -- model: library.author - pk: 66 - fields: {name: Susan Cooper} -- model: library.author - pk: 67 - fields: {name: Donna W. Cross} -- model: library.author - pk: 68 - fields: {name: Peter Prange} -- model: library.author - pk: 69 - fields: {name: Tanja Kinkel} -- model: library.author - pk: 70 - fields: {name: Ken Follett} -- model: library.author - pk: 71 - fields: {name: Minette Walters} -- model: library.author - pk: 72 - fields: {name: Peter Tremayne} -- model: library.author - pk: 73 - fields: {name: Marion Zimmer Bradley} -- model: library.author - pk: 74 - fields: {name: Wolfgang Hohlbein} -- model: library.author - pk: 75 - fields: {name: Friedrich Wilhelm Graf} -- model: library.author - pk: 76 - fields: {name: Nyx Smith} -- model: library.author - pk: 78 - fields: {name: Ferdinand Seibt} -- model: library.author - pk: 79 - fields: {name: Christopher Moore} -- model: library.author - pk: 80 - fields: {name: Jens Gieseke} -- model: library.author - pk: 81 - fields: {name: Bernd Lindner} -- model: library.author - pk: 82 - fields: {name: Horst Poetzsch} -- model: library.author - pk: 84 - fields: {name: Caroline Spector} -- model: library.author - pk: 85 - fields: {name: Peter Godman} -- model: library.author - pk: 86 - fields: {name: Hans Joachim Alpers} -- model: library.author - pk: 87 - fields: {name: Bernhard Schlink} -- model: library.author - pk: 89 - fields: {name: Rebecca Gable} -- model: library.author - pk: 90 - fields: {name: Douglas Adams} -- model: library.author - pk: 91 - fields: {name: Susan Cooper} -- model: library.author - pk: 93 - fields: {name: Donna W. Cross} -- model: library.author - pk: 94 - fields: {name: Peter Prange} -- model: library.author - pk: 95 - fields: {name: Tanja Kinkel} -- model: library.author - pk: 96 - fields: {name: Ken Follett} -- model: library.author - pk: 97 - fields: {name: Minette Walters} -- model: library.author - pk: 99 - fields: {name: Peter Tremayne} -- model: library.author - pk: 101 - fields: {name: Marion Zimmer Bradley} -- model: library.author - pk: 102 - fields: {name: Wolfgang Hohlbein} -- model: library.author - pk: 103 - fields: {name: Friedrich Wilhelm Graf} -- model: library.author - pk: 104 - fields: {name: Terry Pratchett} -- model: library.author - pk: 105 - fields: {name: Daniel Suarez} -- model: library.category - pk: 1 - fields: {name: Science Fiction} -- model: library.category - pk: 2 - fields: {name: Roman} -- model: library.category - pk: 3 - fields: {name: Reference} -- model: library.category - pk: 4 - fields: {name: Fantasy} -- model: library.category - pk: 5 - fields: {name: Comics} -- model: library.category - pk: 6 - fields: {name: Satire} -- model: library.category - pk: 7 - fields: {name: Thriller} -- model: library.edition - pk: 1 - fields: {name: Paperback} -- model: library.edition - pk: 2 - fields: {name: Hardcover} -- model: library.edition - pk: 3 - fields: {name: Softcover} -- model: library.publisher - pk: 1 - fields: {name: Addison-Wesley Verlag} -- model: library.publisher - pk: 2 - fields: {name: O'Reilly Media} -- model: library.publisher - pk: 3 - fields: {name: O'Reilly & Associates} -- model: library.publisher - pk: 4 - fields: {name: Klett-Cotta} -- model: library.publisher - pk: 5 - fields: {name: Diogenes} -- model: library.publisher - pk: 6 - fields: {name: Jaron Verlag} -- model: library.publisher - pk: 7 - fields: {name: Merkur Verlag Rinteln} -- model: library.publisher - pk: 8 - fields: {name: Ehapa Verlag} -- model: library.publisher - pk: 9 - fields: {name: Markt+Technik Verlag} -- model: library.publisher - pk: 10 - fields: {name: Kiepenheuer & Witsch} -- model: library.publisher - pk: 11 - fields: {name: Goldmann Verlag} -- model: library.publisher - pk: 12 - fields: {name: Sams Publishing} -- model: library.publisher - pk: 13 - fields: {name: Wilhelm Heyne Verlag} -- model: library.publisher - pk: 14 - fields: {name: Amman Verlag & Co.} -- model: library.publisher - pk: 15 - fields: {name: Fischer Verlag} -- model: library.publisher - pk: 16 - fields: {name: BestBook} -- model: library.publisher - pk: 17 - fields: {name: List Verlag} -- model: library.publisher - pk: 18 - fields: {name: dpunkt.verlag GmbH} -- model: library.publisher - pk: 19 - fields: {name: Ullstein Verlag} -- model: library.publisher - pk: 20 - fields: {name: Piper Verlag} -- model: library.publisher - pk: 21 - fields: {name: Knaur Verlag} -- model: library.publisher - pk: 22 - fields: {name: Heyne Fantasy} -- model: library.publisher - pk: 23 - fields: {name: Manning Publications Co.} -- model: library.publisher - pk: 24 - fields: {name: ADAC Verlag} -- model: library.publisher - pk: 25 - fields: {name: dpunkt-Verlag} -- model: library.publisher - pk: 26 - fields: {name: Verlag Kiepenheuer & Witsch} -- model: library.publisher - pk: 27 - fields: {name: Hanser Wirtschaft} -- model: library.publisher - pk: 28 - fields: {name: Droemersche Verlagsanstalt} -- model: library.publisher - pk: 29 - fields: {name: Fischer Buecherei GmbH} -- model: library.publisher - pk: 30 - fields: {name: rororo Verlag} -- model: library.publisher - pk: 31 - fields: {name: Hoffmann und Campe} -- model: library.publisher - pk: 32 - fields: {name: Heyne Verlag} -- model: library.publisher - pk: 33 - fields: {name: dpunkt.verlag} -- model: library.publisher - pk: 34 - fields: {name: Dorling Kindersley} -- model: library.publisher - pk: 35 - fields: {name: Ammann Verlag} -- model: library.publisher - pk: 36 - fields: {name: Addison-Wesley} -- model: library.publisher - pk: 37 - fields: {name: Ueberreuter} -- model: library.publisher - pk: 38 - fields: {name: Bertelsmann Club} -- model: library.publisher - pk: 39 - fields: {name: Harriet Eder Verlag} -- model: library.publisher - pk: 40 - fields: {name: Marix Verlag} -- model: library.publisher - pk: 41 - fields: {name: Aufbau Taschenbuch Verlag} -- model: library.publisher - pk: 42 - fields: {name: Rowohlt Taschenbuch Verlag} -- model: library.book - pk: 1 - fields: - title: 2XS - publisher: null - isbn: '' - edition: 1 - pages: null - category: 1 - authors: [58] -- model: library.book - pk: 2 - fields: - title: Daemon - publisher: 42 - isbn: 978 3 499 25643 1 - edition: 1 - pages: 639 - category: 7 - authors: [105] diff --git a/django/kontor/library/migrations/0001_initial.py b/django/kontor/library/migrations/0001_initial.py deleted file mode 100644 index 4e0e7e6..0000000 --- a/django/kontor/library/migrations/0001_initial.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -<<<<<<< HEAD -# Generated by Django 1.9.6 on 2016-05-31 08:57 -======= -# Generated by Django 1.9.2 on 2016-02-16 19:01 ->>>>>>> backup -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Author', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Book', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=40)), - ], - ), - ] diff --git a/django/kontor/library/migrations/0002_auto_20160624_1230.py b/django/kontor/library/migrations/0002_auto_20160624_1230.py deleted file mode 100644 index db3aae0..0000000 --- a/django/kontor/library/migrations/0002_auto_20160624_1230.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-24 12:30 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Category', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Edition', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Publisher', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.AddField( - model_name='book', - name='authors', - field=models.ManyToManyField(blank=True, to='library.Author'), - ), - migrations.AddField( - model_name='book', - name='isbn', - field=models.CharField(max_length=20, null=True), - ), - migrations.AddField( - model_name='book', - name='pages', - field=models.IntegerField(null=True), - ), - migrations.AddField( - model_name='book', - name='category', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='library.Category'), - ), - migrations.AddField( - model_name='book', - name='edition', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='library.Edition'), - ), - migrations.AddField( - model_name='book', - name='publisher', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='library.Publisher'), - ), - ] diff --git a/django/kontor/library/migrations/0003_auto_20160624_1240.py b/django/kontor/library/migrations/0003_auto_20160624_1240.py deleted file mode 100644 index 72717c4..0000000 --- a/django/kontor/library/migrations/0003_auto_20160624_1240.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-24 12:40 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0002_auto_20160624_1230'), - ] - - operations = [ - migrations.AlterField( - model_name='book', - name='isbn', - field=models.CharField(blank=True, max_length=20, null=True), - ), - migrations.AlterField( - model_name='book', - name='pages', - field=models.IntegerField(blank=True, null=True), - ), - ] diff --git a/django/kontor/library/models.py b/django/kontor/library/models.py deleted file mode 100644 index b1f28cd..0000000 --- a/django/kontor/library/models.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import unicode_literals - -from django.db import models - -# Create your models here. - - -class Author(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -<<<<<<< HEAD -class Category(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Edition(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Publisher(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Book(models.Model): - title = models.CharField(max_length=40) - authors = models.ManyToManyField(Author, blank=True) - publisher = models.ForeignKey(Publisher, null=True, blank=True) - isbn = models.CharField(max_length=20, null=True, blank=True) - edition = models.ForeignKey(Edition, null=True, blank=True) - pages = models.IntegerField(null=True, blank=True) - category = models.ForeignKey(Category, null=True, blank=True) -======= -class Book(models.Model): - title = models.CharField(max_length=40) ->>>>>>> backup - - def __str__(self): - return self.title diff --git a/django/kontor/library/templates/library/author_list.html b/django/kontor/library/templates/library/author_list.html deleted file mode 100755 index 2c64e19..0000000 --- a/django/kontor/library/templates/library/author_list.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "base.html" %} -{% block title %}HomeOffice{% endblock %} -{% block content %} - - - {% for author in author_list %} - - - - {% endfor %} -
Name
{{ autor.name }}
-{% endblock %} \ No newline at end of file diff --git a/django/kontor/library/templates/library/index.html b/django/kontor/library/templates/library/index.html deleted file mode 100755 index 8ffdead..0000000 --- a/django/kontor/library/templates/library/index.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "kontor/base.html" %} -{% block title %}Bücher{% endblock %} diff --git a/django/kontor/library/tests.py b/django/kontor/library/tests.py deleted file mode 100644 index 4929020..0000000 --- a/django/kontor/library/tests.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Create your tests here. diff --git a/django/kontor/library/urls.py b/django/kontor/library/urls.py deleted file mode 100755 index b400976..0000000 --- a/django/kontor/library/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.conf.urls import url - -from . import views - -app_name = 'library' -urlpatterns = [ - url(r'^$', views.index, name='index'), - url(r'^author/$', views.AuthorIndexView.as_view(), name='author_list'), -] diff --git a/django/kontor/library/views.py b/django/kontor/library/views.py deleted file mode 100755 index 58b5aed..0000000 --- a/django/kontor/library/views.py +++ /dev/null @@ -1,46 +0,0 @@ -from django.shortcuts import render -<<<<<<< HEAD -from django.http import HttpResponse -from django.views import generic -from django.contrib.auth.decorators import login_required -======= -from django.views import generic ->>>>>>> backup - -from .models import Author -from .models import Book -# Create your views here. - -<<<<<<< HEAD -@login_required -def index(request): - return render(request, 'library/index.html') -======= ->>>>>>> backup - -class AuthorIndexView(generic.ListView): - template_name = 'library/authorindex.html' - context_object_name = 'author_list' - - def get_queryset(self): - """Return the list of authors.""" - return Author.objects.all() - - -class AuthorDetailView(generic.DetailView): - model = Author - template_name = 'library/authordetail.html' - - -class BookIndexView(generic.ListView): - template_name = 'library/bookindex.html' - context_object_name = 'book_list' - - def get_queryset(self): - """Return the list of books.""" - return Book.objects.all() - - -class BookDetailView(generic.DetailView): - model = Book - template_name = 'library/bookdetail.html' diff --git a/django/kontor/manage.py b/django/kontor/manage.py deleted file mode 100755 index c1f1b2c..0000000 --- a/django/kontor/manage.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kontor.settings") - - from django.core.management import execute_from_command_line - - execute_from_command_line(sys.argv) diff --git a/django/kontor/medien/admin.py b/django/kontor/medien/admin.py deleted file mode 100755 index b97a94f..0000000 --- a/django/kontor/medien/admin.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Register your models here. diff --git a/django/kontor/medien/apps.py b/django/kontor/medien/apps.py deleted file mode 100755 index 47c7647..0000000 --- a/django/kontor/medien/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class MedienConfig(AppConfig): - name = 'medien' diff --git a/django/kontor/medien/templates/medien/index.html b/django/kontor/medien/templates/medien/index.html deleted file mode 100755 index 90136c2..0000000 --- a/django/kontor/medien/templates/medien/index.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "kontor/base.html" %} -{% block title %}Medien{% endblock %} diff --git a/django/kontor/medien/urls.py b/django/kontor/medien/urls.py deleted file mode 100755 index 86cfd0a..0000000 --- a/django/kontor/medien/urls.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf.urls import url - -from . import views - -app_name = 'medien' -urlpatterns = [ - url(r'^$', views.index, name='index'), -] diff --git a/django/kontor/medien/views.py b/django/kontor/medien/views.py deleted file mode 100755 index cb7c6ce..0000000 --- a/django/kontor/medien/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.shortcuts import render - -# Create your views here. -def index(request): - return render(request, 'medien/index.html') diff --git a/django/kontor/static/kontor.css b/django/kontor/static/kontor.css deleted file mode 100644 index c61938e..0000000 --- a/django/kontor/static/kontor.css +++ /dev/null @@ -1,109 +0,0 @@ -body { - font-family: sans-serif; - color: #333333; - padding: 3em 0 4em; -} - -body, -.wrapper { - margin: 10px auto; - /*max-width: 60em;*/ -} - -header, main, section, footer { - border-radius: 0px 0.5em 0.5em; - border: 1px solid; - padding: 10px; - margin: 10px; -} - -header { - position:fixed; - top:0px; - left:0px; - right:0px; - text-align:center; - padding: 10px; - background: lightgrey; - /*border-bottom: 1px solid #d5d5d5;*/ -} - -nav { - /*position: fixed;*/ - /*padding-top: 10em; */ - - border-radius: 0px 0.5em 0.5em; - border: 1px solid; - - padding: 0; - margin: 10px; - - font-size: 0.91em; - float: left; - width: 15em; - background: lightskyblue; - border-color: skyblue; -} - -nav ul { - padding: 0; -} - -nav li { - list-style: none; - margin: 0.4em; - padding: 0; -} - -nav ul ul { - margin: 0 0 0 2em; - padding: 0; - border: none; -} - -nav ul ul li { - margin: 0.3em 0; -} - -nav a { - display: block; - padding: 0.4em; - text-decoration: none; - font-weight: bold; - border: 1px solid blue; - border-radius: 10px; - box-shadow: 0px 5px 10px white inset; - background-color: skyblue; - color: #333; - -} - -nav a:focus, -nav a:hover { - color: royalblue; - background-color: gold; -} - -main { - display: block; - background: lightblue; - border-color: #8a9da8; - margin-left: 15em; - min-width: 16em; /* Mindestbreite (der Überschrift) verhindert Anzeigefehler in modernen Browsern */ -} - -footer { - position:fixed; - padding: 10px; - margin-top: 10px; - bottom:0; - left: 0; - right:0; - background: lightgrey; - border-color: grey; -} - -footer p { - float:right; - margin: 0; -} diff --git a/django/kontor/templates/admin/base_site.html b/django/kontor/templates/admin/base_site.html deleted file mode 100755 index cba9fd0..0000000 --- a/django/kontor/templates/admin/base_site.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "admin/base.html" %} - -{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} - -{% block branding %} -

Kontor administration

-{% endblock %} - -{% block nav-global %}{% endblock %} diff --git a/django/kontor/templates/kontor/base.html b/django/kontor/templates/kontor/base.html deleted file mode 100755 index db2f5e4..0000000 --- a/django/kontor/templates/kontor/base.html +++ /dev/null @@ -1,32 +0,0 @@ - - - -{% block title %}Kontor{% endblock %} -{% load staticfiles %} - - - -
Kontor
- {% block navigation %} - - {% endblock %} -
-
- {% block content %}{% endblock %} -
-
- {% if user.is_authenticated %} - - {% else %} -
Login

Ingenieurbüro Thomas Peetz

- {% endif %} - - diff --git a/django/kontor/templates/kontor/index.html b/django/kontor/templates/kontor/index.html deleted file mode 100755 index 22320f6..0000000 --- a/django/kontor/templates/kontor/index.html +++ /dev/null @@ -1 +0,0 @@ -{% extends "kontor/base.html" %} diff --git a/django/kontor/templates/kontor/login.html b/django/kontor/templates/kontor/login.html deleted file mode 100755 index 8700f8b..0000000 --- a/django/kontor/templates/kontor/login.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "kontor/base.html" %} - -{% block content %} -{% if form.errors %} -

Your username and password didn't match. Please try again.

-{% endif %} - -{% if next %} - {% if user.is_authenticated %} -

Your account doesn't have access to this page. To proceed, - please login with an account that has access.

- {% else %} -

Please login to see this page.

- {% endif %} -{% endif %} - -
-{% csrf_token %} - - - - - - - - - -
{{ form.username.label_tag }}{{ form.username }}
{{ form.password.label_tag }}{{ form.password }}
- - - -
-{% endblock %} diff --git a/django/kontor/tradingcards/admin.py b/django/kontor/tradingcards/admin.py deleted file mode 100755 index b97a94f..0000000 --- a/django/kontor/tradingcards/admin.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Register your models here. diff --git a/django/kontor/tradingcards/apps.py b/django/kontor/tradingcards/apps.py deleted file mode 100755 index facb92b..0000000 --- a/django/kontor/tradingcards/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class TradingCardsConfig(AppConfig): - name = 'tradingcards' diff --git a/django/kontor/tradingcards/models.py b/django/kontor/tradingcards/models.py deleted file mode 100755 index 2c38a73..0000000 --- a/django/kontor/tradingcards/models.py +++ /dev/null @@ -1,4 +0,0 @@ -from __future__ import unicode_literals - - -# Create your models here. diff --git a/django/kontor/tradingcards/templates/tradingcards/index.html b/django/kontor/tradingcards/templates/tradingcards/index.html deleted file mode 100755 index 9920067..0000000 --- a/django/kontor/tradingcards/templates/tradingcards/index.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "kontor/base.html" %} -{% block title %}Trading Cards{% endblock %} \ No newline at end of file diff --git a/django/kontor/tradingcards/tests.py b/django/kontor/tradingcards/tests.py deleted file mode 100755 index 4929020..0000000 --- a/django/kontor/tradingcards/tests.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Create your tests here. diff --git a/django/kontor/tradingcards/urls.py b/django/kontor/tradingcards/urls.py deleted file mode 100755 index a3780aa..0000000 --- a/django/kontor/tradingcards/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.conf.urls import url - -from . import views - -urlpatterns = [ - url(r'^$', views.index, name='index'), -] diff --git a/django/kontor/tradingcards/views.py b/django/kontor/tradingcards/views.py deleted file mode 100755 index 4aa36e4..0000000 --- a/django/kontor/tradingcards/views.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.shortcuts import render - -# Create your views here. -def index(request): - return render(request, 'tradingcards/index.html') diff --git a/django/kontor/tysc/__init__.py b/django/kontor/tysc/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/django/kontor/tysc/admin.py b/django/kontor/tysc/admin.py deleted file mode 100644 index 024e870..0000000 --- a/django/kontor/tysc/admin.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.contrib import admin - -from .models import Sport -from .models import Team -from .models import Position -from .models import Player -from .models import Manufacturer -from .models import Serie -from .models import InsertSet -from .models import ParallelSet -from .models import SportCard -# Register your models here. - -admin.site.register(Sport) -admin.site.register(Team) -admin.site.register(Position) -admin.site.register(Player) -admin.site.register(Manufacturer) -admin.site.register(Serie) -admin.site.register(InsertSet) -admin.site.register(ParallelSet) -admin.site.register(SportCard) \ No newline at end of file diff --git a/django/kontor/tysc/apps.py b/django/kontor/tysc/apps.py deleted file mode 100644 index 95ecaae..0000000 --- a/django/kontor/tysc/apps.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import unicode_literals - -from django.apps import AppConfig - - -class TyscConfig(AppConfig): - name = 'tysc' diff --git a/django/kontor/tysc/fixtures/teams.yaml b/django/kontor/tysc/fixtures/teams.yaml deleted file mode 100755 index b07dd35..0000000 --- a/django/kontor/tysc/fixtures/teams.yaml +++ /dev/null @@ -1,561 +0,0 @@ -- model: tysc.sport - pk: 1 - fields: {name: Football} -- model: tysc.sport - pk: 2 - fields: {name: Baseball} -- model: tysc.sport - pk: 3 - fields: {name: Basketball} -- model: tysc.sport - pk: 4 - fields: {name: Hockey} -- model: tysc.team - pk: 1 - fields: {name: Buffalo Bills, shortname: Bills, sport: 1} -- model: tysc.team - pk: 2 - fields: {name: Indianapolis Colts, shortname: Colts, sport: 1} -- model: tysc.team - pk: 3 - fields: {name: Miami Dolphins, shortname: Dolphins, sport: 1} -- model: tysc.team - pk: 4 - fields: {name: New England Patriots, shortname: Patriots, sport: 1} -- model: tysc.team - pk: 5 - fields: {name: New York Jets, shortname: Jets, sport: 1} -- model: tysc.team - pk: 6 - fields: {name: Baltimore Ravens, shortname: Ravens, sport: 1} -- model: tysc.team - pk: 7 - fields: {name: Cincinnati Bengals, shortname: Bengals, sport: 1} -- model: tysc.team - pk: 8 - fields: {name: Cleveland Browns, shortname: Browns, sport: 1} -- model: tysc.team - pk: 9 - fields: {name: Jacksonville Jaguars, shortname: Jaguars, sport: 1} -- model: tysc.team - pk: 10 - fields: {name: Pittsburgh Steelers, shortname: Steelers, sport: 1} -- model: tysc.team - pk: 11 - fields: {name: Tennessee Titans, shortname: Titans, sport: 1} -- model: tysc.team - pk: 12 - fields: {name: Denver Broncos, shortname: Broncos, sport: 1} -- model: tysc.team - pk: 13 - fields: {name: Kansas City Chiefs, shortname: Chiefs, sport: 1} -- model: tysc.team - pk: 14 - fields: {name: Oakland Raiders, shortname: Raiders, sport: 1} -- model: tysc.team - pk: 15 - fields: {name: San Diego Chargers, shortname: Chargers, sport: 1} -- model: tysc.team - pk: 16 - fields: {name: Seattle Seahawks, shortname: Seahawks, sport: 1} -- model: tysc.team - pk: 17 - fields: {name: Arizona Cardinals, shortname: Cardinals, sport: 1} -- model: tysc.team - pk: 18 - fields: {name: Dallas Cowboys, shortname: Cowboys, sport: 1} -- model: tysc.team - pk: 19 - fields: {name: New York Giants, shortname: Giants, sport: 1} -- model: tysc.team - pk: 20 - fields: {name: Philadelphia Eagles, shortname: Eagles, sport: 1} -- model: tysc.team - pk: 21 - fields: {name: Washington Redskins, shortname: Redskins, sport: 1} -- model: tysc.team - pk: 22 - fields: {name: Chicago Bears, shortname: Bears, sport: 1} -- model: tysc.team - pk: 23 - fields: {name: Detroit Lions, shortname: Lions, sport: 1} -- model: tysc.team - pk: 24 - fields: {name: Green Bay Packers, shortname: Packers, sport: 1} -- model: tysc.team - pk: 25 - fields: {name: Minnesota Vikings, shortname: Vikings, sport: 1} -- model: tysc.team - pk: 26 - fields: {name: Tampa Bay Buccaneers, shortname: Buccaneers, sport: 1} -- model: tysc.team - pk: 27 - fields: {name: Atlanta Falcons, shortname: Falcons, sport: 1} -- model: tysc.team - pk: 28 - fields: {name: Carolina Panthers, shortname: Panthers, sport: 1} -- model: tysc.team - pk: 29 - fields: {name: New Orleans Saints, shortname: Saints, sport: 1} -- model: tysc.team - pk: 30 - fields: {name: St.Louis Rams, shortname: Rams, sport: 1} -- model: tysc.team - pk: 31 - fields: {name: San Francisco 49ers, shortname: 49ers, sport: 1} -- model: tysc.team - pk: 32 - fields: {name: Baltimore Orioles, shortname: Orioles, sport: 2} -- model: tysc.team - pk: 33 - fields: {name: Boston Red Sox, shortname: Red Sox, sport: 2} -- model: tysc.team - pk: 34 - fields: {name: New York Yankees, shortname: Yankees, sport: 2} -- model: tysc.team - pk: 35 - fields: {name: Tampa Bay Devil Rays, shortname: Devil Rays, sport: 2} -- model: tysc.team - pk: 36 - fields: {name: Toronto Blue Jays, shortname: Blue Jays, sport: 2} -- model: tysc.team - pk: 37 - fields: {name: Chicago White Sox, shortname: White Sox, sport: 2} -- model: tysc.team - pk: 38 - fields: {name: Cleveland Indians, shortname: Indians, sport: 2} -- model: tysc.team - pk: 39 - fields: {name: Detroit Tigers, shortname: Tigers, sport: 2} -- model: tysc.team - pk: 40 - fields: {name: Kansas City Royals, shortname: Royals, sport: 2} -- model: tysc.team - pk: 41 - fields: {name: Minnesota Twins, shortname: Twins, sport: 2} -- model: tysc.team - pk: 42 - fields: {name: Anaheim Angels, shortname: Angels, sport: 2} -- model: tysc.team - pk: 43 - fields: {name: Oakland Athletics, shortname: Athletics, sport: 2} -- model: tysc.team - pk: 44 - fields: {name: Seattle Mariners, shortname: Mariners, sport: 2} -- model: tysc.team - pk: 45 - fields: {name: Texas Rangers, shortname: Rangers, sport: 2} -- model: tysc.team - pk: 46 - fields: {name: Atlanta Braves, shortname: Braves, sport: 2} -- model: tysc.team - pk: 47 - fields: {name: Florida Marlins, shortname: Marlins, sport: 2} -- model: tysc.team - pk: 48 - fields: {name: Montreal Expos, shortname: Expos, sport: 2} -- model: tysc.team - pk: 49 - fields: {name: New York Mets, shortname: Mets, sport: 2} -- model: tysc.team - pk: 50 - fields: {name: Philadelphia Phillies, shortname: Phillies, sport: 2} -- model: tysc.team - pk: 51 - fields: {name: Chicago Cubs, shortname: Cubs, sport: 2} -- model: tysc.team - pk: 52 - fields: {name: Cincinnati Reds, shortname: Reds, sport: 2} -- model: tysc.team - pk: 53 - fields: {name: Houston Astros, shortname: Astros, sport: 2} -- model: tysc.team - pk: 54 - fields: {name: Milwaukee Brewers, shortname: Brewers, sport: 2} -- model: tysc.team - pk: 55 - fields: {name: Pittsburgh Pirates, shortname: Pirates, sport: 2} -- model: tysc.team - pk: 56 - fields: {name: St.Louis Cardinals, shortname: Cardinals, sport: 2} -- model: tysc.team - pk: 57 - fields: {name: Arizona Diamondbacks, shortname: Diamondbacks, sport: 2} -- model: tysc.team - pk: 58 - fields: {name: Colorado Rockies, shortname: Rockies, sport: 2} -- model: tysc.team - pk: 59 - fields: {name: Los Angeles Dodgers, shortname: Dodgers, sport: 2} -- model: tysc.team - pk: 60 - fields: {name: San Diego Padres, shortname: Padres, sport: 2} -- model: tysc.team - pk: 61 - fields: {name: San Francisco Giants, shortname: Giants, sport: 2} -- model: tysc.team - pk: 62 - fields: {name: Boston Celtics, shortname: Celtics, sport: 3} -- model: tysc.team - pk: 63 - fields: {name: Miami Heat, shortname: Heat, sport: 3} -- model: tysc.team - pk: 64 - fields: {name: New Jersey Nets, shortname: Mets, sport: 3} -- model: tysc.team - pk: 65 - fields: {name: New York Knicks, shortname: Knicks, sport: 3} -- model: tysc.team - pk: 66 - fields: {name: Orlando Magic, shortname: Magic, sport: 3} -- model: tysc.team - pk: 67 - fields: {name: Philadelphia 76ers, shortname: 76ers, sport: 3} -- model: tysc.team - pk: 68 - fields: {name: Washington Wizards, shortname: Wizards, sport: 3} -- model: tysc.team - pk: 69 - fields: {name: Atlanta Hawks, shortname: Hawks, sport: 3} -- model: tysc.team - pk: 70 - fields: {name: Charlotte Hornets, shortname: Hornets, sport: 3} -- model: tysc.team - pk: 71 - fields: {name: Chicago Bulls, shortname: Bulls, sport: 3} -- model: tysc.team - pk: 72 - fields: {name: Cleveland Cavaliers, shortname: Cavaliers, sport: 3} -- model: tysc.team - pk: 73 - fields: {name: Detroit Pistons, shortname: Pistons, sport: 3} -- model: tysc.team - pk: 74 - fields: {name: Indiana Pacers, shortname: Pacers, sport: 3} -- model: tysc.team - pk: 75 - fields: {name: Milwaukee Bucks, shortname: Bucks, sport: 3} -- model: tysc.team - pk: 76 - fields: {name: Toronto Raptors, shortname: Raptors, sport: 3} -- model: tysc.team - pk: 77 - fields: {name: Dallas Mavericks, shortname: Mavericks, sport: 3} -- model: tysc.team - pk: 78 - fields: {name: Denver Nuggets, shortname: Nuggets, sport: 3} -- model: tysc.team - pk: 79 - fields: {name: Houston Rockets, shortname: Rockets, sport: 3} -- model: tysc.team - pk: 80 - fields: {name: Minnesota Timberwolves, shortname: Timberwolves, sport: 3} -- model: tysc.team - pk: 81 - fields: {name: San Antonio Spurs, shortname: Spurs, sport: 3} -- model: tysc.team - pk: 82 - fields: {name: Utah Jazz, shortname: Jazz, sport: 3} -- model: tysc.team - pk: 83 - fields: {name: Vancouver Grizzlies, shortname: Grizzlies, sport: 3} -- model: tysc.team - pk: 84 - fields: {name: Golden State Warriors, shortname: Warriors, sport: 4} -- model: tysc.team - pk: 85 - fields: {name: Los Angeles Clippers, shortname: Clippers, sport: 3} -- model: tysc.team - pk: 86 - fields: {name: Los Angeles Lakers, shortname: Lakers, sport: 3} -- model: tysc.team - pk: 87 - fields: {name: Phoenix Suns, shortname: Suns, sport: 3} -- model: tysc.team - pk: 88 - fields: {name: Portland Trail Blazers, shortname: Blazers, sport: 3} -- model: tysc.team - pk: 89 - fields: {name: Sacramento Kings, shortname: Kings, sport: 3} -- model: tysc.team - pk: 90 - fields: {name: Seattle SuperSonics, shortname: SuperSonics, sport: 3} -- model: tysc.team - pk: 91 - fields: {name: Boston Bruins, shortname: Bruins, sport: 4} -- model: tysc.team - pk: 92 - fields: {name: Buffalo Sabres, shortname: Sabres, sport: 4} -- model: tysc.team - pk: 93 - fields: {name: Montreal Canadiens, shortname: Canadiens, sport: 4} -- model: tysc.team - pk: 94 - fields: {name: Ottawa Senators, shortname: Senators, sport: 4} -- model: tysc.team - pk: 95 - fields: {name: Toronto Maple Leafs, shortname: Maple Leafs, sport: 4} -- model: tysc.team - pk: 96 - fields: {name: New Jersey Devils, shortname: Devils, sport: 4} -- model: tysc.team - pk: 97 - fields: {name: New York Islander, shortname: Islander, sport: 4} -- model: tysc.team - pk: 98 - fields: {name: New York Rangers, shortname: Rangers, sport: 4} -- model: tysc.team - pk: 99 - fields: {name: Philadelphia Flyers, shortname: Flyers, sport: 4} -- model: tysc.team - pk: 100 - fields: {name: Pittsburgh Penguins, shortname: Penguins, sport: 4} -- model: tysc.team - pk: 101 - fields: {name: Atlanta Trashers, shortname: Trashers, sport: 4} -- model: tysc.team - pk: 102 - fields: {name: Carolina Hurricanes, shortname: Hurricanes, sport: 4} -- model: tysc.team - pk: 103 - fields: {name: Florida Panthers, shortname: Panthers, sport: 4} -- model: tysc.team - pk: 104 - fields: {name: Tampa Bay Lightnings, shortname: Lightnings, sport: 4} -- model: tysc.team - pk: 105 - fields: {name: Washington Capitals, shortname: Capitals, sport: 4} -- model: tysc.team - pk: 106 - fields: {name: Chicago Blackhawks, shortname: Blackhawks, sport: 4} -- model: tysc.team - pk: 107 - fields: {name: Columbo Blue Jackets, shortname: Blue Jackets, sport: 4} -- model: tysc.team - pk: 108 - fields: {name: Detroit Red Wings, shortname: Red Wings, sport: 4} -- model: tysc.team - pk: 109 - fields: {name: Nashville Predators, shortname: Predators, sport: 4} -- model: tysc.team - pk: 110 - fields: {name: St.Louis Blues, shortname: Blues, sport: 4} -- model: tysc.team - pk: 111 - fields: {name: Calgary Flames, shortname: Flames, sport: 4} -- model: tysc.team - pk: 112 - fields: {name: Colorado Avalanche, shortname: Avalanche, sport: 4} -- model: tysc.team - pk: 113 - fields: {name: Edmonton Oilers, shortname: Oilers, sport: 4} -- model: tysc.team - pk: 114 - fields: {name: Minnesota Wild, shortname: Wild, sport: 4} -- model: tysc.team - pk: 115 - fields: {name: Vancouver Canucks, shortname: Canucks, sport: 4} -- model: tysc.team - pk: 116 - fields: {name: Anaheim Mighty Ducks, shortname: Mighty Ducks, sport: 4} -- model: tysc.team - pk: 117 - fields: {name: Dallas Stars, shortname: Stars, sport: 4} -- model: tysc.team - pk: 118 - fields: {name: Los Angeles Kings, shortname: Kings, sport: 4} -- model: tysc.team - pk: 119 - fields: {name: Phoenix Coyotes, shortname: Coyotes, sport: 4} -- model: tysc.team - pk: 120 - fields: {name: San Jose Sharks, shortname: Sharks, sport: 4} -- model: tysc.team - pk: 121 - fields: {name: Houston Texans, shortname: Texans, sport: 1} -- model: tysc.team - pk: 122 - fields: {name: Houston Oilers, shortname: Oilers, sport: 1} -- model: tysc.position - pk: 1 - fields: {name: QB, description: Quarterback, sport: 1} -- model: tysc.position - pk: 2 - fields: {name: WR, description: Wide Receiver, sport: 1} -- model: tysc.position - pk: 3 - fields: {name: RB, description: Running Back, sport: 1} -- model: tysc.position - pk: 4 - fields: {name: LB, description: Linebacker, sport: 1} -- model: tysc.position - pk: 5 - fields: {name: TE, description: Tight End, sport: 1} -- model: tysc.position - pk: 6 - fields: {name: FB, description: Fullback, sport: 1} -- model: tysc.position - pk: 7 - fields: {name: SS, description: Strong Safety, sport: 1} -- model: tysc.position - pk: 8 - fields: {name: DE, description: Defensive End, sport: 1} -- model: tysc.position - pk: 9 - fields: {name: K, description: Kicker, sport: 1} -- model: tysc.position - pk: 10 - fields: {name: P, description: Punter, sport: 1} -- model: tysc.position - pk: 11 - fields: {name: LG, description: Left Guard, sport: 1} -- model: tysc.position - pk: 12 - fields: {name: RG, description: Right Guard, sport: 1} -- model: tysc.position - pk: 13 - fields: {name: OF, description: OF, sport: 1} -- model: tysc.position - pk: 14 - fields: {name: DB, description: Defensive Back, sport: 1} -- model: tysc.position - pk: 15 - fields: {name: CB, description: Corner Back, sport: 1} -- model: tysc.position - pk: 16 - fields: {name: C, description: Center, sport: 2} -- model: tysc.position - pk: 17 - fields: {name: 1B, description: First Base, sport: 2} -- model: tysc.position - pk: 18 - fields: {name: 2B, description: Second Base, sport: 2} -- model: tysc.position - pk: 19 - fields: {name: 3B, description: Third Base, sport: 2} -- model: tysc.position - pk: 20 - fields: {name: SS, description: SS, sport: 2} -- model: tysc.position - pk: 21 - fields: {name: LF, description: Left Field, sport: 2} -- model: tysc.position - pk: 22 - fields: {name: CF, description: Center Field, sport: 2} -- model: tysc.position - pk: 23 - fields: {name: RF, description: Right Field, sport: 2} -- model: tysc.position - pk: 24 - fields: {name: DH, description: DH, sport: 2} -- model: tysc.position - pk: 25 - fields: {name: P, description: Pitcher, sport: 2} -- model: tysc.player - pk: 1 - fields: {name: 'Pathon, Jerome'} -- model: tysc.player - pk: 2 - fields: {name: 'Bruschi, Tedy'} -- model: tysc.player - pk: 3 - fields: {name: 'Couch, Tim'} -- model: tysc.player - pk: 4 - fields: {name: 'Shea, Aaron'} -- model: tysc.player - pk: 5 - fields: {name: 'Lewis, Jamal'} -- model: tysc.player - pk: 6 - fields: {name: 'Lewis, Jermaine'} -- model: tysc.player - pk: 7 - fields: {name: 'Banks, Tony'} -- model: tysc.player - pk: 8 - fields: {name: "Fuamatu-Ma'Afala, Chris"} -- model: tysc.player - pk: 9 - fields: {name: 'Bettis, Jerome'} -- model: tysc.player - pk: 10 - fields: {name: 'Stewart, Kordell'} -- model: tysc.player - pk: 11 - fields: {name: 'Moon, Warren'} -- model: tysc.player - pk: 12 - fields: {name: 'Lockett, Kevin'} -- model: tysc.player - pk: 13 - fields: {name: 'Gannon, Rich'} -- model: tysc.player - pk: 14 - fields: {name: 'Jett, James'} -- model: tysc.player - pk: 15 - fields: {name: 'Strong, Mack'} -- model: tysc.player - pk: 16 - fields: {name: 'Huard, Brock'} -- model: tysc.player - pk: 17 - fields: {name: 'Watters, Ricky'} -- model: tysc.player - pk: 18 - fields: {name: 'Aikman, Troy'} -- model: tysc.player - pk: 19 - fields: {name: 'LaFleur, David'} -- model: tysc.player - pk: 20 - fields: {name: 'Brazzell, Chris'} -- model: tysc.player - pk: 21 - fields: {name: 'Dayne, Ron'} -- model: tysc.player - pk: 22 - fields: {name: 'Brown, Na'} -- model: tysc.player - pk: 23 - fields: {name: 'Small, Torrance'} -- model: tysc.player - pk: 24 - fields: {name: 'Lewis, Chad'} -- model: tysc.player - pk: 25 - fields: {name: 'Murrell, Adrian'} -- model: tysc.player - pk: 26 - fields: {name: 'Smith, Maurice'} -- model: tysc.player - pk: 27 - fields: {name: 'Chandler, Chris'} -- model: tysc.player - pk: 28 - fields: {name: 'Kanell, Danny'} -- model: tysc.player - pk: 29 - fields: {name: 'Williams, Ricky'} -- model: tysc.player - pk: 30 - fields: {name: 'Garcia, Jeff'} -- model: tysc.player - pk: 31 - fields: {name: 'Streets, Tai'} -- model: tysc.player - pk: 32 - fields: {name: 'Garner, Charlie'} -- model: tysc.player - pk: 33 - fields: {name: 'Rice, Jerry'} -- model: tysc.player - pk: 34 - fields: {name: 'Owens, Terrell'} -- model: tysc.player - pk: 35 - fields: {name: 'Bruce, Isaac'} -- model: tysc.player - pk: 36 - fields: {name: 'Canidate, Trung'} diff --git a/django/kontor/tysc/migrations/0001_initial.py b/django/kontor/tysc/migrations/0001_initial.py deleted file mode 100644 index f4d3882..0000000 --- a/django/kontor/tysc/migrations/0001_initial.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-02-15 09:56 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Sport', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Team', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=60)), - ('shortname', models.CharField(max_length=30)), - ('sport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Sport')), - ], - ), - ] diff --git a/django/kontor/tysc/migrations/0002_auto_20160216_2201.py b/django/kontor/tysc/migrations/0002_auto_20160216_2201.py deleted file mode 100644 index e2df575..0000000 --- a/django/kontor/tysc/migrations/0002_auto_20160216_2201.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-02-16 22:01 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('tysc', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='InsertSet', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Manufacturer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='ParallelSet', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ('manufacturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Manufacturer')), - ], - ), - migrations.CreateModel( - name='Player', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ], - ), - migrations.CreateModel( - name='Position', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=4)), - ('description', models.CharField(max_length=30)), - ('sport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Sport')), - ], - ), - migrations.CreateModel( - name='Serie', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ('manufacturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Manufacturer')), - ], - ), - migrations.CreateModel( - name='SportCard', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('rookie', models.BooleanField()), - ('year', models.IntegerField()), - ('number', models.IntegerField()), - ('insert_set', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='tysc.InsertSet')), - ('manufacturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Manufacturer')), - ('parallel_set', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='tysc.ParallelSet')), - ('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Player')), - ('serie', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='tysc.Serie')), - ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Team')), - ], - ), - migrations.AddField( - model_name='insertset', - name='manufacturer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tysc.Manufacturer'), - ), - ] diff --git a/django/kontor/tysc/migrations/__init__.py b/django/kontor/tysc/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/django/kontor/tysc/models.py b/django/kontor/tysc/models.py deleted file mode 100644 index 10d3eb5..0000000 --- a/django/kontor/tysc/models.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import unicode_literals - -from django.db import models - -# Create your models here. - - -class Sport(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Position(models.Model): - name = models.CharField(max_length=4) - description = models.CharField(max_length=30) - sport = models.ForeignKey(Sport) - - def __str__(self): - return self.name + '(' + self.description + ')' - - -class Team(models.Model): - name = models.CharField(max_length=60) - shortname = models.CharField(max_length=30) - sport = models.ForeignKey(Sport) - - def __str__(self): - return self.name - - -class Player(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Manufacturer(models.Model): - name = models.CharField(max_length=40) - - def __str__(self): - return self.name - - -class Serie(models.Model): - name = models.CharField(max_length=40) - manufacturer = models.ForeignKey(Manufacturer) - - def __str__(self): - return self.name - - -class InsertSet(models.Model): - name = models.CharField(max_length=40) - manufacturer = models.ForeignKey(Manufacturer) - - def __str__(self): - return self.name - - -class ParallelSet(models.Model): - name = models.CharField(max_length=40) - manufacturer = models.ForeignKey(Manufacturer) - - def __str__(self): - return self.name - - -class SportCard(models.Model): - player = models.ForeignKey(Player) - team = models.ForeignKey(Team) - manufacturer = models.ForeignKey(Manufacturer) - serie = models.ForeignKey(Serie, null=True) - parallel_set = models.ForeignKey(ParallelSet, null=True) - insert_set = models.ForeignKey(InsertSet, null=True) - rookie = models.BooleanField() - year = models.IntegerField() - number = models.IntegerField() - - def __str__(self): - return str(self.number) diff --git a/django/kontor/tysc/templates/tysc/index.html b/django/kontor/tysc/templates/tysc/index.html deleted file mode 100755 index 7cfcf38..0000000 --- a/django/kontor/tysc/templates/tysc/index.html +++ /dev/null @@ -1,2 +0,0 @@ -{% extends "kontor/base.html" %} -{% block title %}TradeYourSportsCards{% endblock %} diff --git a/django/kontor/tysc/tests.py b/django/kontor/tysc/tests.py deleted file mode 100644 index 4929020..0000000 --- a/django/kontor/tysc/tests.py +++ /dev/null @@ -1,2 +0,0 @@ - -# Create your tests here. diff --git a/django/kontor/tysc/urls.py b/django/kontor/tysc/urls.py deleted file mode 100755 index e243e6e..0000000 --- a/django/kontor/tysc/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.conf.urls import url - -from . import views - -urlpatterns = [ - url(r'^$', views.index, name='index'), -] -<<<<<<< HEAD -======= - ->>>>>>> backup diff --git a/django/kontor/tysc/views.py b/django/kontor/tysc/views.py deleted file mode 100755 index 632d963..0000000 --- a/django/kontor/tysc/views.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.shortcuts import render -from django.http import HttpResponse - -# Create your views here. - -<<<<<<< HEAD -def index(request): - return render(request, 'tysc/index.html') -======= - -def index(request): - return HttpResponse('You are in the TYSC application') ->>>>>>> backup diff --git a/flask/.gitignore b/flask/.gitignore deleted file mode 100644 index 259ed2a..0000000 --- a/flask/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__pycache__/ -.idea diff --git a/flask/README.md b/flask/README.md deleted file mode 100644 index 6aad8a5..0000000 --- a/flask/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Kontor Flask - diff --git a/flask/app.py b/flask/app.py deleted file mode 100644 index dc827b3..0000000 --- a/flask/app.py +++ /dev/null @@ -1,5 +0,0 @@ -from kontor import create_app - -if __name__ == '__main__': - app = create_app() - app.run(host="0.0.0.0", port=8000, debug=True) diff --git a/flask/kontor/__init__.py b/flask/kontor/__init__.py deleted file mode 100644 index f8cb55c..0000000 --- a/flask/kontor/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -from flask import Flask, render_template -from flask_jwt_extended import JWTManager - -from kontor import config -from kontor.extensions import db, ma -from logging.config import dictConfig - -dictConfig({ - 'version': 1, - 'formatters': {'default': { - 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', - }}, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'default' - }}, - 'root': { - 'level': 'INFO', - 'handlers': ['wsgi'] - } -}) - -app = Flask(__name__) - - -def create_app(config_class=config.Config): - app.config.from_object(config_class) - - db.init_app(app) - ma.init_app(app) - # Initialize Flask extensions here - app.config["JWT_SECRET_KEY"] = "super-secret" # Change this! - jwt = JWTManager(app) - - with app.app_context(): - # db.create_all() - db.reflect() - - # Register blueprints here - from kontor.main import bp as main_bp - app.register_blueprint(main_bp) - from kontor.comics import comics_bp - app.register_blueprint(comics_bp, url_prefix='/comics') - from kontor.api import api_bp - app.register_blueprint(api_bp, url_prefix='/api/v1') - from kontor.comics import comics_api - app.register_blueprint(comics_api, url_prefix='/api/v1/comics') - - from kontor.media import media_bp - app.register_blueprint(media_bp, url_prefix='/media') - from kontor.media import media_api - app.register_blueprint(media_api, url_prefix='/api/v1/media') - # from kontor.auth.auth import auth_bp - # from kontor.cart.cart import cart_bp - # from kontor.general.general import general_bp - # app.register_blueprint(auth_bp) - # app.register_blueprint(cart_bp, url_prefix='/cart') - # app.register_blueprint(general_bp) - - return app diff --git a/flask/kontor/api/__init__.py b/flask/kontor/api/__init__.py deleted file mode 100644 index b26fcb6..0000000 --- a/flask/kontor/api/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from flask import Blueprint - -api_bp = Blueprint('api_bp', __name__) - -from kontor.api import routes diff --git a/flask/kontor/api/routes.py b/flask/kontor/api/routes.py deleted file mode 100644 index 4e9b489..0000000 --- a/flask/kontor/api/routes.py +++ /dev/null @@ -1,30 +0,0 @@ -from flask import jsonify, request -from flask_jwt_extended import jwt_required, get_jwt_identity, create_access_token - -from kontor.api import api_bp - - -@api_bp.route('/') -def index(): - modules = ['comics'] - return jsonify(modules) - - -# Create a route to authenticate your users and return JWTs. The -# create_access_token() function is used to actually generate the JWT. -@api_bp.route("/login", methods=["POST"]) -def login(): - username = request.json.get("username", None) - password = request.json.get("password", None) - if username != "test" or password != "test": - return jsonify({"msg": "Bad username or password"}), 401 - - access_token = create_access_token(identity=username) - return jsonify(access_token=access_token) - - -@api_bp.route('/protected', methods=['GET']) -@jwt_required() -def protected(): - current_user = get_jwt_identity() - return {'message': f'Hello, {current_user}!'} diff --git a/flask/kontor/auth/__init__.py b/flask/kontor/auth/__init__.py deleted file mode 100644 index 9da7988..0000000 --- a/flask/kontor/auth/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -import bcrypt -from flask import session -from flask_httpauth import HTTPBasicAuth - -from kontor import app -from kontor.auth.models import User - -auth = HTTPBasicAuth() - - -@auth.verify_password -def verify_password(username, password): - if username is None: - return False - # Add your authentication logic here - app.logger.info("login user %s", username) - user = User.query.filter_by(user_name=username).first() - app.logger.info("User: %s", user) - app.logger.info("Stored Password: '%s' Hashed Password: '%s'", user.password, bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())) - if 'user_name' in session and session['user_name'] == username: - return True - return False \ No newline at end of file diff --git a/flask/kontor/auth/models.py b/flask/kontor/auth/models.py deleted file mode 100644 index b037f02..0000000 --- a/flask/kontor/auth/models.py +++ /dev/null @@ -1,45 +0,0 @@ -from kontor.extensions import db -from sqlalchemy.sql import func - - -class User(db.Model): - # __table__ = db.metadata.tables["publisher"] - __tablename__ = "user" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - enabled = db.Column(db.SmallInteger) - email = db.Column(db.String) - first_name = db.Column(db.String) - last_name = db.Column(db.String) - user_name = db.Column(db.String) - password = db.Column(db.String) - token = db.Column(db.String) - token_expired = db.Column(db.SmallInteger) - - def is_token_valid(self): - return self.review == 'b\x01' - - def is_user_enabled(self): - return self.should_download == 'b\x01' - -class Role(db.Model): - __tablename__ = "role" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - name = db.Column(db.String) - -class AuthorizationMatrix(db.Model): - __tablename__ = "authorization_matrix" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - role_id = db.Column(db.String, db.ForeignKey("role.id")) - user_id = db.Column(db.String, db.ForeignKey("user.id")) diff --git a/flask/kontor/comics/__init__.py b/flask/kontor/comics/__init__.py deleted file mode 100644 index 12bb371..0000000 --- a/flask/kontor/comics/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from flask import Blueprint - -comics_bp = Blueprint('comics_bp', __name__, - template_folder='templates', - static_folder='static', static_url_path='assets') -comics_api = Blueprint('comics_api', __name__) - -from kontor.comics import routes -from kontor.comics import api diff --git a/flask/kontor/comics/api.py b/flask/kontor/comics/api.py deleted file mode 100644 index 163e0c2..0000000 --- a/flask/kontor/comics/api.py +++ /dev/null @@ -1,27 +0,0 @@ - -from kontor.comics import comics_api -from kontor.models import Comic, comics_schema, Publisher, comic_schema, publisher_schema, publishers_schema - - -@comics_api.route('/') -def index(): - comics = Comic.query.all() - return comics_schema.dump(comics) - - -@comics_api.route('/comic/') -def view(comic_id): - comic = Comic.query.get(comic_id) - return comic_schema.dump(comic) - - -@comics_api.route('/publisher/') -def publisher_all(): - publishers = Publisher.query.all() - return publishers_schema.dump(publishers) - - -@comics_api.route('/publisher/') -def publisher_detail(publisher_id): - publisher = Publisher.query.get(publisher_id) - return publisher_schema.dump(publisher) \ No newline at end of file diff --git a/flask/kontor/comics/routes.py b/flask/kontor/comics/routes.py deleted file mode 100644 index 28b93fe..0000000 --- a/flask/kontor/comics/routes.py +++ /dev/null @@ -1,16 +0,0 @@ -from flask import render_template - -from kontor.comics import comics_bp -from kontor.models import Comic - - -@comics_bp.route('/') -def index(): - comics = Comic.query.all() - return render_template('comics/list.html', comics=comics) - - -@comics_bp.route('/comic/') -def view(comic_id): - comic = Comic.query.get(comic_id) - return render_template('comics/view.html', comic=comic) diff --git a/flask/kontor/comics/templates/comics/list.html b/flask/kontor/comics/templates/comics/list.html deleted file mode 100644 index c0f4922..0000000 --- a/flask/kontor/comics/templates/comics/list.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} - -

{% block title %} Comics {% endblock %}

-
-
-

Comics Blueprint

- {% for comic in comics %} -
- -

- {{ comic.title }} -

-
-

{{ comic.publisher.name }}

-
-

Created

-

{{ comic.created_date }}

-

Modified

-

{{ comic.last_modified_date }}

-
-

Version: {{ comic.version }}

-

Review: {{ comic.review }}

-
- {% endfor %} -
-{% endblock %} diff --git a/flask/kontor/comics/templates/comics/view.html b/flask/kontor/comics/templates/comics/view.html deleted file mode 100644 index b70da14..0000000 --- a/flask/kontor/comics/templates/comics/view.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} - -

{% block title %} Comics {% endblock %}

-
-
-

Comics Blueprint

-
- -

- {{ comic.title }} -

-
- -

{{ comic.id }}

-
-
-

Created

-

{{ comic.created_date }}

-

Modified

-

{{ comic.last_modified_date }}

-
-

Version: {{ comic.version }}

-
-
-{% endblock %} diff --git a/flask/kontor/config.py b/flask/kontor/config.py deleted file mode 100644 index 8382f66..0000000 --- a/flask/kontor/config.py +++ /dev/null @@ -1,10 +0,0 @@ -import os - -basedir = os.path.abspath(os.path.dirname(__file__)) - - -class Config: - SECRET_KEY = os.environ.get('SECRET_KEY') - # SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or 'sqlite:///' + os.path.join(basedir, 'kontor.db') - SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or 'mariadb+mariadbconnector://kontor:kontor@localhost/kontor' - SQLALCHEMY_TRACK_MODIFICATIONS = False diff --git a/flask/kontor/extensions.py b/flask/kontor/extensions.py deleted file mode 100644 index 461bd5d..0000000 --- a/flask/kontor/extensions.py +++ /dev/null @@ -1,5 +0,0 @@ -import flask_sqlalchemy -from flask_marshmallow import Marshmallow - -db = flask_sqlalchemy.SQLAlchemy() -ma = Marshmallow() diff --git a/flask/kontor/main/__init__.py b/flask/kontor/main/__init__.py deleted file mode 100644 index ebdaf6e..0000000 --- a/flask/kontor/main/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from flask import Blueprint - -bp = Blueprint('main', __name__) - -from kontor.main import routes diff --git a/flask/kontor/main/routes.py b/flask/kontor/main/routes.py deleted file mode 100644 index 0c2e5dd..0000000 --- a/flask/kontor/main/routes.py +++ /dev/null @@ -1,18 +0,0 @@ -from flask import render_template, session - -from kontor import app -from kontor.main import bp -from kontor.auth import auth - - -@bp.route('/') -@auth.login_required -def index(): - return render_template('index.html') - -@bp.route('/logout') -def logout(): - app.logger.info("logout") - auth.current_user() - session['user_name'] = None - return render_template('index.html') diff --git a/flask/kontor/media/__init__.py b/flask/kontor/media/__init__.py deleted file mode 100644 index 581af5f..0000000 --- a/flask/kontor/media/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from flask import Blueprint - -media_bp = Blueprint('media_bp', __name__, - template_folder='templates', - static_folder='static', static_url_path='assets') -media_api = Blueprint('media_api', __name__) - -from kontor.media import routes -from kontor.media import api diff --git a/flask/kontor/media/api.py b/flask/kontor/media/api.py deleted file mode 100644 index d46fa00..0000000 --- a/flask/kontor/media/api.py +++ /dev/null @@ -1,17 +0,0 @@ - -from kontor import app -from kontor.media import media_api -from kontor.media.models import MediaFile, mediafile_schema, mediafiles_schema - - -@media_api.route('/') -def mediafile_list(): - app.logger.info("get all media files") - files = MediaFile.query.all() - return mediafiles_schema.dump(files) - - -@media_api.route('/mediafile/') -def mediafile_detail(file_id): - file = MediaFile.query.get(file_id) - return mediafile_schema.dump(file) diff --git a/flask/kontor/media/models.py b/flask/kontor/media/models.py deleted file mode 100644 index 4e54978..0000000 --- a/flask/kontor/media/models.py +++ /dev/null @@ -1,43 +0,0 @@ -from kontor.extensions import db, ma -from sqlalchemy.sql import func - - -class MediaFile(db.Model): - # __table__ = db.metadata.tables["publisher"] - __tablename__ = "media_file" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - title = db.Column(db.String) - file_name = db.Column(db.String) - url = db.Column(db.String) - path = db.Column(db.String) - cloud_link = db.Column(db.String) - review = db.Column(db.SmallInteger) - should_download = db.Column(db.Boolean) - - def is_review(self): - return self.review == 'b\x00' - - def is_download(self): - return self.should_download == 'b\x00' - - -class MediaFileSchema(ma.SQLAlchemySchema): - class Meta: - model = MediaFile - fields = ("id", "created_date", "last_modified_date", "version", "title", "file_name", "url", "path", "cloud_link", "review", "should_download", "_links") - - # Smart hyperlinking - _links = ma.Hyperlinks( - { - "self": ma.URLFor("media_api.mediafile_detail", values=dict(mediafile_id="")), - "collection": ma.URLFor("media_api.mediafile_list"), - } - ) - - -mediafile_schema = MediaFileSchema() -mediafiles_schema = MediaFileSchema(many=True) diff --git a/flask/kontor/media/routes.py b/flask/kontor/media/routes.py deleted file mode 100644 index fb47a55..0000000 --- a/flask/kontor/media/routes.py +++ /dev/null @@ -1,16 +0,0 @@ -from flask import render_template - -from kontor.media import media_bp -from kontor.media.models import MediaFile - - -@media_bp.route('/') -def mediafile_list(): - files = MediaFile.query.all() - return render_template('media/mediafile_list.html', mediafiles=files) - - -@media_bp.route('/mediafile/') -def mediafile_detail(mediafile_id): - mediafile = MediaFile.query.get(mediafile_id) - return render_template('media/mediafile_detail.html', mediafile=mediafile) diff --git a/flask/kontor/media/templates/media/mediafile_detail.html b/flask/kontor/media/templates/media/mediafile_detail.html deleted file mode 100644 index e3474ae..0000000 --- a/flask/kontor/media/templates/media/mediafile_detail.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} - -

{% block title %} MediaFile {% endblock %}

-
-
-

MediaFile Blueprint

-
- -

- {{ mediafile.title }} -

-
- -

{{ mediafile.id }}

-
-
-

Created

-

{{ mediafile.created_date }}

-

Modified

-

{{ mediafile.last_modified_date }}

-
-

Version: {{ mediafile.version }}

-

Review: {{ mediafile.is_review() }}

-

Should Download: {{mediafile.is_download() }}

-
-
-{% endblock %} diff --git a/flask/kontor/media/templates/media/mediafile_list.html b/flask/kontor/media/templates/media/mediafile_list.html deleted file mode 100644 index 2d7d29f..0000000 --- a/flask/kontor/media/templates/media/mediafile_list.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} - -

{% block title %} MediaFile {% endblock %}

-
-
-

MediaFile Blueprint

- {% for mediafile in mediafiles %} -
- -

- {{ mediafile.title }} -

-
-

{{ mediafile.id }}

-
-

Created

-

{{ mediafile.created_date }}

-

Modified

-

{{ mediafile.last_modified_date }}

-
-

Version: {{ mediafile.version }}

-

Review: {{ mediafile.is_review() }}

-

Should Download: {{ mediafile.is_download() }}

-

Links: {{ mediafile._links }}

-
- {% endfor %} -
-{% endblock %} diff --git a/flask/kontor/models.py b/flask/kontor/models.py deleted file mode 100644 index eba153c..0000000 --- a/flask/kontor/models.py +++ /dev/null @@ -1,49 +0,0 @@ -from kontor.extensions import db, ma -from sqlalchemy.sql import func - - -class Publisher(db.Model): - # __table__ = db.metadata.tables["publisher"] - __tablename__ = "publisher" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - name = db.Column(db.String) - comics = db.relationship('Comic', back_populates='publisher', lazy='dynamic') - - -class PublisherSchema(ma.SQLAlchemySchema): - class Meta: - model = Publisher - - comics = ma.List(ma.HyperlinkRelated("comics_api.index")) - - -publisher_schema = PublisherSchema() -publishers_schema = PublisherSchema(many=True) - - -class Comic(db.Model): - # __table__ = db.metadata.tables["comic"] - __tablename__ = "comic" - __table_args__ = {'extend_existing': True} - id = db.Column(db.String, primary_key=True) - created_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - last_modified_date = db.Column(db.DateTime(timezone=True), server_default=func.now()) - version = db.Column(db.Integer) - title = db.Column(db.String) - publisher_id = db.Column(db.String, db.ForeignKey("publisher.id")) - publisher = db.relationship("Publisher", back_populates="comics") - - -class ComicSchema(ma.SQLAlchemyAutoSchema): - class Meta: - model = Comic - include_fk = True - publisher = ma.HyperlinkRelated("comics_api.publisher_detail") - - -comic_schema = ComicSchema() -comics_schema = ComicSchema(many=True) diff --git a/flask/kontor/templates/base.html b/flask/kontor/templates/base.html deleted file mode 100644 index 0d7af2d..0000000 --- a/flask/kontor/templates/base.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - {% block title %} {% endblock %} - FlaskApp - - - - -
-
- {% block content %} {% endblock %} -
- - diff --git a/flask/kontor/templates/index.html b/flask/kontor/templates/index.html deleted file mode 100644 index e9210ee..0000000 --- a/flask/kontor/templates/index.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'base.html' %} - -{% block content %} -

{% block title %} The Home Page of Kontor {% endblock %}

-
-

This is the main Flask blueprint

-
-{% endblock %} diff --git a/kontor-api/.gitignore b/kontor-api/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/kontor-api/.gitignore @@ -0,0 +1 @@ +.env diff --git a/kontor-api/Dockerfile b/kontor-api/Dockerfile index b83ef6a..645a82b 100644 --- a/kontor-api/Dockerfile +++ b/kontor-api/Dockerfile @@ -51,5 +51,5 @@ ENV PATH="/app/.venv/bin:$PATH" EXPOSE $PORT # Start the application with Uvicorn in production mode, using environment variable references -CMD ["uvicorn", "src.main:app", "--log-level", "info", "--host", "0.0.0.0" , "--port", "8800"] +CMD ["uvicorn", "src.main:kontor", "--log-level", "info", "--host", "0.0.0.0" , "--port", "8800"] diff --git a/kontor-api/Makefile b/kontor-api/Makefile index b7063f5..9c05f76 100644 --- a/kontor-api/Makefile +++ b/kontor-api/Makefile @@ -10,5 +10,5 @@ docker: clean docker build --target=production -t kontor-api -t kontor-api:0.1.0-SNAPSHOT . dev: - DB_HOST=localhost uv run fastapi dev src/main.py --port 8008 + MARIADB_SERVER=localhost uv run fastapi dev src/main.py --port 8008 diff --git a/kontor-api/pyproject.toml b/kontor-api/pyproject.toml index 44dda1e..5714289 100644 --- a/kontor-api/pyproject.toml +++ b/kontor-api/pyproject.toml @@ -18,4 +18,7 @@ dependencies = [ "requests>=2.32.3", "sqlalchemy>=2.0.40", "sqlmodel>=0.0.24", + "python-dotenv>=1.1.0", + "python-jose>=3.4.0", + "python-multipart>=0.0.20", ] diff --git a/django/kontor/comics/__init__.py b/kontor-api/src/apis/__init__.py similarity index 100% rename from django/kontor/comics/__init__.py rename to kontor-api/src/apis/__init__.py diff --git a/kontor-api/src/apis/base.py b/kontor-api/src/apis/base.py new file mode 100644 index 0000000..e969691 --- /dev/null +++ b/kontor-api/src/apis/base.py @@ -0,0 +1,8 @@ +from fastapi import APIRouter + +from src.apis.version1 import comic, media, tysc + +api_router = APIRouter(prefix="/api") +api_router.include_router(comic.router, prefix="/comics", tags=["comics"]) +api_router.include_router(media.router, prefix="/media", tags=["media"]) +api_router.include_router(tysc.router, prefix="/tysc", tags=["tysc"]) diff --git a/kontor-api/src/apis/utils.py b/kontor-api/src/apis/utils.py new file mode 100644 index 0000000..716d2be --- /dev/null +++ b/kontor-api/src/apis/utils.py @@ -0,0 +1,8 @@ +from typing import Annotated + +from fastapi import Depends +from sqlalchemy.orm import Session + +from src.db.session import get_db + +SessionDep = Annotated[Session, Depends(get_db)] diff --git a/django/kontor/comics/migrations/__init__.py b/kontor-api/src/apis/version1/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/comics/migrations/__init__.py rename to kontor-api/src/apis/version1/__init__.py diff --git a/kontor-api/src/routers/comic.py b/kontor-api/src/apis/version1/comic.py similarity index 90% rename from kontor-api/src/routers/comic.py rename to kontor-api/src/apis/version1/comic.py index 0504f5d..a558b3b 100644 --- a/kontor-api/src/routers/comic.py +++ b/kontor-api/src/apis/version1/comic.py @@ -3,10 +3,10 @@ from typing import List from fastapi import APIRouter, HTTPException, status from sqlalchemy import select -from src.models.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info -from src.models.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse, get_artist_details -from src.routers import SessionDep -from src.schema.comic import Comic, Artist +from src.apis.utils import SessionDep +from src.schema.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info +from src.schema.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse, get_artist_details +from src.db.models.comic import Comic, Artist router = APIRouter( prefix="/comic", diff --git a/kontor-api/src/routers/media.py b/kontor-api/src/apis/version1/media.py similarity index 94% rename from kontor-api/src/routers/media.py rename to kontor-api/src/apis/version1/media.py index 63bcd1f..2fa7347 100644 --- a/kontor-api/src/routers/media.py +++ b/kontor-api/src/apis/version1/media.py @@ -4,9 +4,9 @@ from uuid import UUID from fastapi import APIRouter, status, HTTPException from sqlalchemy import select, Sequence -from src.models.media.file import MediaFileResponse, Link, get_file_details, set_file -from src.routers import SessionDep -from src.schema.media import MediaFile +from src.apis.utils import SessionDep +from src.schema.media.file import MediaFileResponse, Link, get_file_details, set_file +from src.db.models.media import MediaFile router = APIRouter( prefix="/media", diff --git a/kontor-api/src/routers/tysc.py b/kontor-api/src/apis/version1/tysc.py similarity index 77% rename from kontor-api/src/routers/tysc.py rename to kontor-api/src/apis/version1/tysc.py index 63342a7..1128771 100644 --- a/kontor-api/src/routers/tysc.py +++ b/kontor-api/src/apis/version1/tysc.py @@ -1,9 +1,9 @@ from typing import List from fastapi import APIRouter -from src.models.tysc.sport import SportResponse -from src.routers import SessionDep -from src.schema.tysc import Sport +from src.apis.utils import SessionDep +from src.schema.tysc.sport import SportResponse +from src.db.models.tysc import Sport router = APIRouter( prefix="/tysc", diff --git a/django/kontor/homeoffice/__init__.py b/kontor-api/src/core/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/homeoffice/__init__.py rename to kontor-api/src/core/__init__.py diff --git a/kontor-api/src/core/config.py b/kontor-api/src/core/config.py new file mode 100644 index 0000000..5f14424 --- /dev/null +++ b/kontor-api/src/core/config.py @@ -0,0 +1,23 @@ +import os +from pathlib import Path + +from dotenv import load_dotenv + +env_path = Path(".") / ".env" +load_dotenv(dotenv_path=env_path) + + +class Settings: + PROJECT_NAME: str = "Kontor" + PROJECT_VERSION: str = "0.1.0" + + MARIADB_USER: str = os.getenv("MARIADB_USER", "kontor") + MARIADB_PASSWORD: str = os.getenv("MARIADB_PASSWORD", "kontor") + MARIADB_SERVER: str = os.getenv("MARIADB_SERVER", "mariadb") + MARIADB_PORT: str = os.getenv("MARIADB_PORT", 3306) + MARIADB_DB: str = os.getenv("MARIADB_DB", "kontor") + DATABASE_URL: str = f"mariadb+mariadbconnector://{MARIADB_USER}:{MARIADB_PASSWORD}@{MARIADB_SERVER}:{MARIADB_PORT}/{MARIADB_DB}" + + +settings = Settings() + diff --git a/django/kontor/homeoffice/migrations/__init__.py b/kontor-api/src/db/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/homeoffice/migrations/__init__.py rename to kontor-api/src/db/__init__.py diff --git a/django/kontor/kontor/__init__.py b/kontor-api/src/db/models/__init__.py similarity index 100% rename from django/kontor/kontor/__init__.py rename to kontor-api/src/db/models/__init__.py diff --git a/kontor-api/src/schema/admin.py b/kontor-api/src/db/models/admin.py similarity index 98% rename from kontor-api/src/schema/admin.py rename to kontor-api/src/db/models/admin.py index c5b3e99..47441a5 100644 --- a/kontor-api/src/schema/admin.py +++ b/kontor-api/src/db/models/admin.py @@ -4,7 +4,7 @@ from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship, mapped_column, Mapped -from .base import Base, BaseMixin +from src.db.models.base import Base, BaseMixin class User(Base, BaseMixin): diff --git a/kontor-api/src/schema/base.py b/kontor-api/src/db/models/base.py similarity index 100% rename from kontor-api/src/schema/base.py rename to kontor-api/src/db/models/base.py diff --git a/kontor-api/src/schema/bookshelf.py b/kontor-api/src/db/models/bookshelf.py similarity index 97% rename from kontor-api/src/schema/bookshelf.py rename to kontor-api/src/db/models/bookshelf.py index 91e0ae4..d01fc6b 100644 --- a/kontor-api/src/schema/bookshelf.py +++ b/kontor-api/src/db/models/bookshelf.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.orm import relationship -from .base import Base, BaseMixin +from src.db.models.base import Base, BaseMixin class Article(Base, BaseMixin): diff --git a/kontor-api/src/schema/comic.py b/kontor-api/src/db/models/comic.py similarity index 98% rename from kontor-api/src/schema/comic.py rename to kontor-api/src/db/models/comic.py index 1052d79..e83d28b 100644 --- a/kontor-api/src/schema/comic.py +++ b/kontor-api/src/db/models/comic.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship -from .base import Base, BaseMixin +from src.db.models.base import Base, BaseMixin class Publisher(Base, BaseMixin): diff --git a/kontor-api/src/schema/database.py b/kontor-api/src/db/models/database.py similarity index 96% rename from kontor-api/src/schema/database.py rename to kontor-api/src/db/models/database.py index e4e35eb..0d5998b 100644 --- a/kontor-api/src/schema/database.py +++ b/kontor-api/src/db/models/database.py @@ -3,7 +3,6 @@ import logging import uuid from datetime import datetime from enum import Enum, auto -from logging import Logger from pathlib import Path from typing import Any @@ -11,12 +10,12 @@ from sqlalchemy import select from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker -from .tysc import Card, CardSet, Rooster, Team, FieldPosition, Player, Vendor, Sport -from .comic import Issue, TradePaperback, StoryArc, Volume, ComicWork, Artist, Comic, Publisher, WorkType -from .bookshelf import ArticleAuthor, BookAuthor, BookshelfPublisher, Article, Book, Author -from .admin import Mail, MailAccount, ModuleData, Role, User, Token, AuthorizationMatrix -from .metadata import MetaDataTable, MetaDataColumn -from .media import MediaVideo, MediaArticle, MediaFile, MediaActor, MediaActorFile +from src.db.models.tysc import Card, CardSet, Rooster, Team, FieldPosition, Player, Vendor, Sport +from src.db.models.comic import Issue, TradePaperback, StoryArc, Volume, ComicWork, Artist, Comic, Publisher, WorkType +from src.db.models.bookshelf import ArticleAuthor, BookAuthor, BookshelfPublisher, Article, Book, Author +from src.db.models.admin import Mail, MailAccount, ModuleData, Role, User, Token, AuthorizationMatrix +from src.db.models.metadata import MetaDataTable, MetaDataColumn +from src.db.models.media import MediaVideo, MediaArticle, MediaFile, MediaActor, MediaActorFile class ColumnEntry(Enum): diff --git a/kontor-api/src/schema/media.py b/kontor-api/src/db/models/media.py similarity index 98% rename from kontor-api/src/schema/media.py rename to kontor-api/src/db/models/media.py index c1616f9..4c0b21a 100644 --- a/kontor-api/src/schema/media.py +++ b/kontor-api/src/db/models/media.py @@ -10,7 +10,7 @@ from sqlalchemy import Column, String, ForeignKey from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship -from .base import Base, BaseMixin, BaseVideoMixin +from src.db.models.base import Base, BaseMixin, BaseVideoMixin class MediaFile(Base, BaseMixin, BaseVideoMixin): diff --git a/kontor-api/src/schema/metadata.py b/kontor-api/src/db/models/metadata.py similarity index 96% rename from kontor-api/src/schema/metadata.py rename to kontor-api/src/db/models/metadata.py index 950cebe..081c3af 100644 --- a/kontor-api/src/schema/metadata.py +++ b/kontor-api/src/db/models/metadata.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, String, ForeignKey, Integer from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship -from .base import Base, BaseMixin +from src.db.models.base import Base, BaseMixin class MetaDataTable(Base, BaseMixin): diff --git a/kontor-api/src/schema/tysc.py b/kontor-api/src/db/models/tysc.py similarity index 98% rename from kontor-api/src/schema/tysc.py rename to kontor-api/src/db/models/tysc.py index 32c88f1..dae0417 100644 --- a/kontor-api/src/schema/tysc.py +++ b/kontor-api/src/db/models/tysc.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship -from .base import Base, BaseMixin +from src.db.models.base import Base, BaseMixin class Sport(Base, BaseMixin): diff --git a/kontor-api/src/db/session.py b/kontor-api/src/db/session.py new file mode 100644 index 0000000..713deb6 --- /dev/null +++ b/kontor-api/src/db/session.py @@ -0,0 +1,15 @@ +from typing import Generator, Annotated + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, Session + +from src.core.config import settings + +SQLALCHEMY_DATABASE_URL = settings.DATABASE_URL +engine = create_engine(SQLALCHEMY_DATABASE_URL) + +SessionLocal = sessionmaker(bind=engine) + +def get_db() -> Generator: + with SessionLocal() as db: + yield db diff --git a/kontor-api/src/main.py b/kontor-api/src/main.py index 27d9c1b..749d3b4 100644 --- a/kontor-api/src/main.py +++ b/kontor-api/src/main.py @@ -1,13 +1,29 @@ from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles -from src.routers import comic, media, tysc +from src.apis.base import api_router +from src.db.session import engine +from src.webapps.base import api_router as web_app_router +from src.core.config import settings +from src.db.models.base import Base -app = FastAPI() +def include_router(app: FastAPI): + app.include_router(api_router) + app.include_router(web_app_router) -app.include_router(comic.router) -app.include_router(media.router) -app.include_router(tysc.router) +def configure_static(app: FastAPI): + app.mount("/static", StaticFiles(directory="src/static"), name="static") + +def create_tables(): + Base.metadata.create_all(bind=engine) + +def start_application(): + app = FastAPI(title=settings.PROJECT_NAME, version=settings.PROJECT_VERSION) + include_router(app) + configure_static(app) + create_tables() + return app + + +kontor = start_application() -@app.get("/") -def read_root(): - return {"Hello": "World"} diff --git a/kontor-api/src/models/__init__.py b/kontor-api/src/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kontor-api/src/models/comics/__init__.py b/kontor-api/src/models/comics/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kontor-api/src/models/media/__init__.py b/kontor-api/src/models/media/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kontor-api/src/models/tysc/__init__.py b/kontor-api/src/models/tysc/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kontor-api/src/routers/__init__.py b/kontor-api/src/routers/__init__.py deleted file mode 100644 index 5bc1995..0000000 --- a/kontor-api/src/routers/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -import logging -import os -from typing import Annotated - -from fastapi import Depends -from src.schema.base import Base -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, Session - -connect_string = ('mariadb+mariadbconnector://{}:{}@{}:{}/{}'.format( - os.environ.get('DB_USER', 'kontor'), - os.environ.get('DB_PASSWORD', 'kontor'), - os.environ.get('DB_HOST', 'mariadb'), - os.environ.get('DB_PORT', 3306), - os.environ.get('DB_NAME', 'kontor') -)) -engine = create_engine(connect_string) -SessionLocal = sessionmaker(bind=engine) -Base.metadata.create_all(bind=engine, checkfirst=True) - -def get_db(): - logging.info("get_db") - with SessionLocal() as db: - yield db - -SessionDep = Annotated[Session, Depends(get_db)] diff --git a/kontor-api/src/schema/__init__.py b/kontor-api/src/schema/__init__.py index e8a1685..e69de29 100644 --- a/kontor-api/src/schema/__init__.py +++ b/kontor-api/src/schema/__init__.py @@ -1,9 +0,0 @@ -from .admin import User, Token, Role, AuthorizationMatrix, ModuleData, MailAccount, Mail -from .bookshelf import Article, Book, Author, BookshelfPublisher, ArticleAuthor, BookAuthor -from .comic import Comic, Artist, Publisher, Issue, StoryArc, TradePaperback, Volume, ComicWork, WorkType -from .metadata import MetaDataTable, MetaDataColumn -from .tysc import Card, CardSet, Sport, Team, FieldPosition, Rooster, Player, Vendor -from .media import MediaFile, MediaArticle, MediaVideo -from .base import Base -from .database import KontorDB, ColumnEntry - diff --git a/django/kontor/library/__init__.py b/kontor-api/src/schema/comics/__init__.py similarity index 100% rename from django/kontor/library/__init__.py rename to kontor-api/src/schema/comics/__init__.py diff --git a/kontor-api/src/models/comics/artist.py b/kontor-api/src/schema/comics/artist.py similarity index 92% rename from kontor-api/src/models/comics/artist.py rename to kontor-api/src/schema/comics/artist.py index f668875..1b28812 100644 --- a/kontor-api/src/models/comics/artist.py +++ b/kontor-api/src/schema/comics/artist.py @@ -1,10 +1,9 @@ from typing import List, Dict from uuid import UUID -from src.schema.comic import Artist from pydantic import BaseModel -from src.schema import Artist +from src.db.models.comic import Artist class ArtistCreation(BaseModel): diff --git a/kontor-api/src/models/comics/comic.py b/kontor-api/src/schema/comics/comic.py similarity index 89% rename from kontor-api/src/models/comics/comic.py rename to kontor-api/src/schema/comics/comic.py index 0235f1b..feec39d 100644 --- a/kontor-api/src/models/comics/comic.py +++ b/kontor-api/src/schema/comics/comic.py @@ -1,10 +1,9 @@ from typing import List, Dict from uuid import UUID -from src.schema.comic import Comic from pydantic import BaseModel -from src.schema import Comic +from src.db.models.comic import Comic class ComicResponse(BaseModel): @@ -14,6 +13,7 @@ class ComicResponse(BaseModel): class ComicDetailsResponse(BaseModel): id: UUID + created: str title: str completed : bool current_order : bool @@ -22,12 +22,12 @@ class ComicDetailsResponse(BaseModel): works: Dict[str, List[str]] def get_short_info(comic: Comic) -> ComicResponse: - reponse = ComicResponse( + response = ComicResponse( id=comic.id, title=comic.title, completed=(comic.completed == 1) ) - return reponse + return response def get_comic_details(comic: Comic) -> ComicDetailsResponse | None: @@ -44,6 +44,7 @@ def get_comic_details(comic: Comic) -> ComicDetailsResponse | None: works[work_type] = [artist_name] response = ComicDetailsResponse( id=comic.id, + created=str(comic.created_date), title=comic.title, completed=(comic.completed == 1), current_order=(comic.current_order == 1), diff --git a/django/kontor/library/migrations/__init__.py b/kontor-api/src/schema/media/__init__.py similarity index 100% rename from django/kontor/library/migrations/__init__.py rename to kontor-api/src/schema/media/__init__.py diff --git a/kontor-api/src/models/media/file.py b/kontor-api/src/schema/media/file.py similarity index 97% rename from kontor-api/src/models/media/file.py rename to kontor-api/src/schema/media/file.py index 7912637..2c468e8 100644 --- a/kontor-api/src/models/media/file.py +++ b/kontor-api/src/schema/media/file.py @@ -1,7 +1,7 @@ from datetime import datetime from uuid import UUID -from src.schema.media import MediaFile +from src.db.models.media import MediaFile from pydantic import BaseModel diff --git a/django/kontor/medien/__init__.py b/kontor-api/src/schema/tysc/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/medien/__init__.py rename to kontor-api/src/schema/tysc/__init__.py diff --git a/kontor-api/src/models/tysc/sport.py b/kontor-api/src/schema/tysc/sport.py similarity index 100% rename from kontor-api/src/models/tysc/sport.py rename to kontor-api/src/schema/tysc/sport.py diff --git a/kontor-api/src/static/images/logo.png b/kontor-api/src/static/images/logo.png new file mode 100644 index 0000000..7499bdf Binary files /dev/null and b/kontor-api/src/static/images/logo.png differ diff --git a/kontor-api/src/static/js/autocomplete.js b/kontor-api/src/static/js/autocomplete.js new file mode 100644 index 0000000..efd5e90 --- /dev/null +++ b/kontor-api/src/static/js/autocomplete.js @@ -0,0 +1,5 @@ +$( function() { + $( "#autocomplete" ).autocomplete({ + source: "/jobs/autocomplete" + }); + } ); diff --git a/kontor-api/src/templates/comic/artist_detail.html b/kontor-api/src/templates/comic/artist_detail.html new file mode 100644 index 0000000..2c69b0d --- /dev/null +++ b/kontor-api/src/templates/comic/artist_detail.html @@ -0,0 +1,45 @@ +{% extends "shared/base.html" %} + + +{% block title %} + Comic Detail +{% endblock %} + +{% block content %} +
+
+
+

Comic Detail

+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Artist Name{{artist.name}}
Works + {% for work in artist.comic_works %} +

+ {{work.work_type.name}}: {{work.comic.title}} +

+ {% endfor %} +
Data Created{{artist.created_date}}
Data Modified{{artist.last_modified_date}}
+
+
+{% endblock %} diff --git a/kontor-api/src/templates/comic/artists.html b/kontor-api/src/templates/comic/artists.html new file mode 100644 index 0000000..466364a --- /dev/null +++ b/kontor-api/src/templates/comic/artists.html @@ -0,0 +1,32 @@ +{% extends "shared/base.html" %} + +{% block title %} + Comic Artists +{% endblock %} + +{% block content %} + {% with msg=msg %} + {% include "components/alerts.html" %} + {% endwith %} +
+
+
+

Find Artists..

+
+
+
+ {% for artist in artists %} +
+ {% with obj=artist %} + {% include "components/artist_cards.html" %} + {% endwith %} + + {% if loop.index %3 %} +
+ {% else %} +

+ {% endif %} + {% endfor %} +
+ +{% endblock %} diff --git a/kontor-api/src/templates/comic/comic_detail.html b/kontor-api/src/templates/comic/comic_detail.html new file mode 100644 index 0000000..57965fc --- /dev/null +++ b/kontor-api/src/templates/comic/comic_detail.html @@ -0,0 +1,53 @@ +{% extends "shared/base.html" %} + + +{% block title %} + Comic Detail +{% endblock %} + +{% block content %} +
+
+
+

Comic Detail

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Comic Title{{comic.title}}
Publisher{{comic.publisher.name}}
Completed{{comic.completed}}
Works + {% for work in comic.comic_works %} +

+ {{work.work_type.name}}: {{work.artist.name}} +

+ {% endfor %} +
Data Created{{comic.created_date}}
Data Modified{{comic.last_modified_date}}
+
+
+{% endblock %} diff --git a/kontor-api/src/templates/comic/comics.html b/kontor-api/src/templates/comic/comics.html new file mode 100644 index 0000000..6da1b24 --- /dev/null +++ b/kontor-api/src/templates/comic/comics.html @@ -0,0 +1,32 @@ +{% extends "shared/base.html" %} + +{% block title %} + Comic List +{% endblock %} + +{% block content %} + {% with msg=msg %} + {% include "components/alerts.html" %} + {% endwith %} +
+
+
+

Find Jobs..

+
+
+
+ {% for comic in comics %} +
+ {% with obj=comic %} + {% include "components/comic_cards.html" %} + {% endwith %} + + {% if loop.index %3 %} +
+ {% else %} +

+ {% endif %} + {% endfor %} +
+ +{% endblock %} diff --git a/kontor-api/src/templates/components/alerts.html b/kontor-api/src/templates/components/alerts.html new file mode 100644 index 0000000..667fbdc --- /dev/null +++ b/kontor-api/src/templates/components/alerts.html @@ -0,0 +1,5 @@ +{% if msg %} + +{% endif %} diff --git a/kontor-api/src/templates/components/artist_cards.html b/kontor-api/src/templates/components/artist_cards.html new file mode 100644 index 0000000..53192af --- /dev/null +++ b/kontor-api/src/templates/components/artist_cards.html @@ -0,0 +1,6 @@ +
+
+
{{obj.name}}
+ Read more +
+
diff --git a/kontor-api/src/templates/components/comic_cards.html b/kontor-api/src/templates/components/comic_cards.html new file mode 100644 index 0000000..4d0354f --- /dev/null +++ b/kontor-api/src/templates/components/comic_cards.html @@ -0,0 +1,8 @@ +
+
+
{{obj.title}}
+

Publisher : {{obj.publisher.name}}

+

Completed : {{obj.completed}}

+ Read more +
+
diff --git a/kontor-api/src/templates/components/navbar.html b/kontor-api/src/templates/components/navbar.html new file mode 100644 index 0000000..2d037e7 --- /dev/null +++ b/kontor-api/src/templates/components/navbar.html @@ -0,0 +1,60 @@ + diff --git a/kontor-api/src/templates/index.html b/kontor-api/src/templates/index.html new file mode 100644 index 0000000..315ea33 --- /dev/null +++ b/kontor-api/src/templates/index.html @@ -0,0 +1,14 @@ +{% extends "shared/base.html" %} + + +{% block title %} + Kontor +{% endblock %} + +{% block content %} + {% with msg=msg %} + {% include "components/alerts.html" %} + {% endwith %} +
+
+{% endblock %} diff --git a/kontor-api/src/templates/shared/base.html b/kontor-api/src/templates/shared/base.html new file mode 100644 index 0000000..af6e986 --- /dev/null +++ b/kontor-api/src/templates/shared/base.html @@ -0,0 +1,26 @@ + + + + + + + + {% block title %} + {% endblock %} + + + + {% include "components/navbar.html" %} + {% block content %} + {% endblock %} + + + + + + {% block scripts %} + {% endblock %} + + + + diff --git a/django/kontor/tradingcards/__init__.py b/kontor-api/src/webapps/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/tradingcards/__init__.py rename to kontor-api/src/webapps/__init__.py diff --git a/kontor-api/src/webapps/base.py b/kontor-api/src/webapps/base.py new file mode 100644 index 0000000..022ea9a --- /dev/null +++ b/kontor-api/src/webapps/base.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter, Request +from fastapi.templating import Jinja2Templates + +from src.webapps.comic import route_comics + +templates = Jinja2Templates(directory="src/templates") + +api_router = APIRouter() +api_router.include_router(route_comics.router) + +@api_router.get("/") +def home(request: Request, msg: str = None): + return templates.TemplateResponse("index.html", {"request": request, "msg": msg}) diff --git a/django/kontor/tradingcards/migrations/__init__.py b/kontor-api/src/webapps/comic/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from django/kontor/tradingcards/migrations/__init__.py rename to kontor-api/src/webapps/comic/__init__.py diff --git a/kontor-api/src/webapps/comic/route_comics.py b/kontor-api/src/webapps/comic/route_comics.py new file mode 100644 index 0000000..524ea76 --- /dev/null +++ b/kontor-api/src/webapps/comic/route_comics.py @@ -0,0 +1,31 @@ +from uuid import UUID + +from fastapi import APIRouter, Request +from fastapi.templating import Jinja2Templates + +from src.apis.utils import SessionDep +from src.db.models.comic import Comic, Artist +from src.schema.comics.comic import get_comic_details + +templates = Jinja2Templates(directory="src/templates") +router = APIRouter(include_in_schema=False, prefix="/comic") + +@router.get("/comics") +def get_comics(db: SessionDep, request: Request, msg: str = None): + comics = db.query(Comic).all() + return templates.TemplateResponse("comic/comics.html", {"request": request, "msg": msg, "comics": comics}) + +@router.get("/comics/{comic_id}") +def comic_details(comic_id: UUID, request: Request, db: SessionDep): + comic = db.get(Comic, comic_id) + return templates.TemplateResponse("comic/comic_detail.html", {"request": request, "comic":comic}) + +@router.get("/artists") +def get_artists(db: SessionDep, request: Request, msg: str = None): + artists = db.query(Artist).all() + return templates.TemplateResponse("comic/artists.html", {"request": request, "msg": msg, "artists": artists}) + +@router.get("/artists/{artist_id}") +def artist_detail(artist_id: UUID, request: Request, db: SessionDep): + artist = db.get(Artist, artist_id) + return templates.TemplateResponse("comic/artist_detail.html", {"request": request, "artist": artist}) diff --git a/kontor-api/uv.lock b/kontor-api/uv.lock index f156c50..14578de 100644 --- a/kontor-api/uv.lock +++ b/kontor-api/uv.lock @@ -1,14 +1,14 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.13" [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -19,9 +19,9 @@ dependencies = [ { name = "idna" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" }, ] [[package]] @@ -32,40 +32,40 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, ] [[package]] name = "certifi" version = "2025.1.31" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577, upload_time = "2025-01-31T02:16:47.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393, upload_time = "2025-01-31T02:16:45.015Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188, upload_time = "2024-12-24T18:12:35.43Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698, upload_time = "2024-12-24T18:11:05.834Z" }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162, upload_time = "2024-12-24T18:11:07.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263, upload_time = "2024-12-24T18:11:08.374Z" }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966, upload_time = "2024-12-24T18:11:09.831Z" }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992, upload_time = "2024-12-24T18:11:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162, upload_time = "2024-12-24T18:11:13.372Z" }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972, upload_time = "2024-12-24T18:11:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095, upload_time = "2024-12-24T18:11:17.672Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668, upload_time = "2024-12-24T18:11:18.989Z" }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073, upload_time = "2024-12-24T18:11:21.507Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732, upload_time = "2024-12-24T18:11:22.774Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391, upload_time = "2024-12-24T18:11:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702, upload_time = "2024-12-24T18:11:26.535Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767, upload_time = "2024-12-24T18:12:32.852Z" }, ] [[package]] @@ -75,56 +75,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "coverage" -version = "7.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708 }, - { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981 }, - { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495 }, - { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538 }, - { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561 }, - { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633 }, - { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712 }, - { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000 }, - { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195 }, - { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998 }, - { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541 }, - { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767 }, - { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997 }, - { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708 }, - { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046 }, - { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139 }, - { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307 }, - { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116 }, - { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909 }, - { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068 }, - { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "dnspython" version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload_time = "2024-10-05T20:14:59.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload_time = "2024-10-05T20:14:57.687Z" }, +] + +[[package]] +name = "ecdsa" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/1f/924e3caae75f471eae4b26bd13b698f6af2c44279f67af317439c2f4c46a/ecdsa-0.19.1.tar.gz", hash = "sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61", size = 201793, upload_time = "2025-03-13T11:52:43.25Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a3/460c57f094a4a165c84a1341c373b0a4f5ec6ac244b998d5021aade89b77/ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3", size = 150607, upload_time = "2025-03-13T11:52:41.757Z" }, ] [[package]] @@ -135,9 +118,9 @@ dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload_time = "2024-06-20T11:30:30.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, ] [[package]] @@ -149,9 +132,9 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, ] [package.optional-dependencies] @@ -173,9 +156,9 @@ dependencies = [ { name = "typer" }, { name = "uvicorn", extra = ["standard"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload_time = "2024-12-15T14:28:10.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload_time = "2024-12-15T14:28:06.18Z" }, ] [package.optional-dependencies] @@ -187,34 +170,34 @@ standard = [ name = "greenlet" version = "3.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/9c/666d8c71b18d0189cf801c0e0b31c4bfc609ac823883286045b1f3ae8994/greenlet-3.2.0.tar.gz", hash = "sha256:1d2d43bd711a43db8d9b9187500e6432ddb4fafe112d082ffabca8660a9e01a7", size = 183685 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/9c/666d8c71b18d0189cf801c0e0b31c4bfc609ac823883286045b1f3ae8994/greenlet-3.2.0.tar.gz", hash = "sha256:1d2d43bd711a43db8d9b9187500e6432ddb4fafe112d082ffabca8660a9e01a7", size = 183685, upload_time = "2025-04-15T16:21:26.141Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/43/c0b655d4d7eae19282b028bcec449e5c80626ad0d8d0ca3703f9b1c29258/greenlet-3.2.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b86a3ccc865ae601f446af042707b749eebc297928ea7bd0c5f60c56525850be", size = 269131 }, - { url = "https://files.pythonhosted.org/packages/7c/7d/c8f51c373c7f7ac0f73d04a6fd77ab34f6f643cb41a0d186d05ba96708e7/greenlet-3.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144283ad88ed77f3ebd74710dd419b55dd15d18704b0ae05935766a93f5671c5", size = 637323 }, - { url = "https://files.pythonhosted.org/packages/89/65/c3ee41b2e56586737d6e124b250583695628ffa6b324855b3a1267a8d1d9/greenlet-3.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be69cd50994b8465c3ad1467f9e63001f76e53a89440ad4440d1b6d52591280", size = 651430 }, - { url = "https://files.pythonhosted.org/packages/f0/07/33bd7a3dcde1db7259371d026ce76be1eb653d2d892334fc79a500b3c5ee/greenlet-3.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47aeadd1e8fbdef8fdceb8fb4edc0cbb398a57568d56fd68f2bc00d0d809e6b6", size = 645798 }, - { url = "https://files.pythonhosted.org/packages/35/5b/33c221a6a867030b0b770513a1b78f6c30e04294131dafdc8da78906bbe6/greenlet-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18adc14ab154ca6e53eecc9dc50ff17aeb7ba70b7e14779b26e16d71efa90038", size = 648271 }, - { url = "https://files.pythonhosted.org/packages/4d/dd/d6452248fa6093504e3b7525dc2bdc4e55a4296ec6ee74ba241a51d852e2/greenlet-3.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8622b33d8694ec373ad55050c3d4e49818132b44852158442e1931bb02af336", size = 606779 }, - { url = "https://files.pythonhosted.org/packages/9d/24/160f04d2589bcb15b8661dcd1763437b22e01643626899a4139bf98f02af/greenlet-3.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8ac9a2c20fbff3d0b853e9ef705cdedb70d9276af977d1ec1cde86a87a4c821", size = 1117968 }, - { url = "https://files.pythonhosted.org/packages/6c/ff/c6e3f3a5168fef5209cfd9498b2b5dd77a0bf29dfc686a03dcc614cf4432/greenlet-3.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:cd37273dc7ca1d5da149b58c8b3ce0711181672ba1b09969663905a765affe21", size = 1145510 }, - { url = "https://files.pythonhosted.org/packages/dc/62/5215e374819052e542b5bde06bd7d4a171454b6938c96a2384f21cb94279/greenlet-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8a8940a8d301828acd8b9f3f85db23069a692ff2933358861b19936e29946b95", size = 296004 }, - { url = "https://files.pythonhosted.org/packages/62/6d/dc9c909cba5cbf4b0833fce69912927a8ca74791c23c47b9fd4f28092108/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee59db626760f1ca8da697a086454210d36a19f7abecc9922a2374c04b47735b", size = 629900 }, - { url = "https://files.pythonhosted.org/packages/5e/a9/f3f304fbbbd604858ff3df303d7fa1d8f7f9e45a6ef74481aaf03aaac021/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7154b13ef87a8b62fc05419f12d75532d7783586ad016c57b5de8a1c6feeb517", size = 635270 }, - { url = "https://files.pythonhosted.org/packages/34/92/4b7b4e2e23ecc723cceef9fe3898e78c8e14e106cc7ba2f276a66161da3e/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:199453d64b02d0c9d139e36d29681efd0e407ed8e2c0bf89d88878d6a787c28f", size = 632534 }, - { url = "https://files.pythonhosted.org/packages/da/7f/91f0ecbe72c9d789fb7f400b39da9d1e87fcc2cf8746a9636479ba79ab01/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0010e928e1901d36625f21d008618273f9dda26b516dbdecf873937d39c9dff0", size = 628826 }, - { url = "https://files.pythonhosted.org/packages/9f/59/e449a44ce52b13751f55376d85adc155dd311608f6d2aa5b6bd2c8d15486/greenlet-3.2.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6005f7a86de836a1dc4b8d824a2339cdd5a1ca7cb1af55ea92575401f9952f4c", size = 593697 }, - { url = "https://files.pythonhosted.org/packages/bb/09/cca3392927c5c990b7a8ede64ccd0712808438d6490d63ce6b8704d6df5f/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:17fd241c0d50bacb7ce8ff77a30f94a2d0ca69434ba2e0187cf95a5414aeb7e1", size = 1105762 }, - { url = "https://files.pythonhosted.org/packages/4d/b9/3d201f819afc3b7a8cd7ebe645f1a17799603e2d62c968154518f79f4881/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:7b17a26abc6a1890bf77d5d6b71c0999705386b00060d15c10b8182679ff2790", size = 1125173 }, - { url = "https://files.pythonhosted.org/packages/80/7b/773a30602234597fc2882091f8e1d1a38ea0b4419d99ca7ed82c827e2c3a/greenlet-3.2.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:397b6bbda06f8fe895893d96218cd6f6d855a6701dc45012ebe12262423cec8b", size = 269908 }, + { url = "https://files.pythonhosted.org/packages/c9/43/c0b655d4d7eae19282b028bcec449e5c80626ad0d8d0ca3703f9b1c29258/greenlet-3.2.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:b86a3ccc865ae601f446af042707b749eebc297928ea7bd0c5f60c56525850be", size = 269131, upload_time = "2025-04-15T16:19:19.469Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7d/c8f51c373c7f7ac0f73d04a6fd77ab34f6f643cb41a0d186d05ba96708e7/greenlet-3.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:144283ad88ed77f3ebd74710dd419b55dd15d18704b0ae05935766a93f5671c5", size = 637323, upload_time = "2025-04-15T16:49:02.677Z" }, + { url = "https://files.pythonhosted.org/packages/89/65/c3ee41b2e56586737d6e124b250583695628ffa6b324855b3a1267a8d1d9/greenlet-3.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5be69cd50994b8465c3ad1467f9e63001f76e53a89440ad4440d1b6d52591280", size = 651430, upload_time = "2025-04-15T16:50:43.445Z" }, + { url = "https://files.pythonhosted.org/packages/f0/07/33bd7a3dcde1db7259371d026ce76be1eb653d2d892334fc79a500b3c5ee/greenlet-3.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47aeadd1e8fbdef8fdceb8fb4edc0cbb398a57568d56fd68f2bc00d0d809e6b6", size = 645798, upload_time = "2025-04-15T16:55:03.795Z" }, + { url = "https://files.pythonhosted.org/packages/35/5b/33c221a6a867030b0b770513a1b78f6c30e04294131dafdc8da78906bbe6/greenlet-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18adc14ab154ca6e53eecc9dc50ff17aeb7ba70b7e14779b26e16d71efa90038", size = 648271, upload_time = "2025-04-15T16:22:42.458Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dd/d6452248fa6093504e3b7525dc2bdc4e55a4296ec6ee74ba241a51d852e2/greenlet-3.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8622b33d8694ec373ad55050c3d4e49818132b44852158442e1931bb02af336", size = 606779, upload_time = "2025-04-15T16:22:41.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/24/160f04d2589bcb15b8661dcd1763437b22e01643626899a4139bf98f02af/greenlet-3.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8ac9a2c20fbff3d0b853e9ef705cdedb70d9276af977d1ec1cde86a87a4c821", size = 1117968, upload_time = "2025-04-15T16:52:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ff/c6e3f3a5168fef5209cfd9498b2b5dd77a0bf29dfc686a03dcc614cf4432/greenlet-3.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:cd37273dc7ca1d5da149b58c8b3ce0711181672ba1b09969663905a765affe21", size = 1145510, upload_time = "2025-04-15T16:23:01.873Z" }, + { url = "https://files.pythonhosted.org/packages/dc/62/5215e374819052e542b5bde06bd7d4a171454b6938c96a2384f21cb94279/greenlet-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8a8940a8d301828acd8b9f3f85db23069a692ff2933358861b19936e29946b95", size = 296004, upload_time = "2025-04-15T16:55:46.007Z" }, + { url = "https://files.pythonhosted.org/packages/62/6d/dc9c909cba5cbf4b0833fce69912927a8ca74791c23c47b9fd4f28092108/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee59db626760f1ca8da697a086454210d36a19f7abecc9922a2374c04b47735b", size = 629900, upload_time = "2025-04-15T16:49:04.099Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a9/f3f304fbbbd604858ff3df303d7fa1d8f7f9e45a6ef74481aaf03aaac021/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7154b13ef87a8b62fc05419f12d75532d7783586ad016c57b5de8a1c6feeb517", size = 635270, upload_time = "2025-04-15T16:50:44.769Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/4b7b4e2e23ecc723cceef9fe3898e78c8e14e106cc7ba2f276a66161da3e/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:199453d64b02d0c9d139e36d29681efd0e407ed8e2c0bf89d88878d6a787c28f", size = 632534, upload_time = "2025-04-15T16:55:05.203Z" }, + { url = "https://files.pythonhosted.org/packages/da/7f/91f0ecbe72c9d789fb7f400b39da9d1e87fcc2cf8746a9636479ba79ab01/greenlet-3.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0010e928e1901d36625f21d008618273f9dda26b516dbdecf873937d39c9dff0", size = 628826, upload_time = "2025-04-15T16:22:44.545Z" }, + { url = "https://files.pythonhosted.org/packages/9f/59/e449a44ce52b13751f55376d85adc155dd311608f6d2aa5b6bd2c8d15486/greenlet-3.2.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6005f7a86de836a1dc4b8d824a2339cdd5a1ca7cb1af55ea92575401f9952f4c", size = 593697, upload_time = "2025-04-15T16:22:43.796Z" }, + { url = "https://files.pythonhosted.org/packages/bb/09/cca3392927c5c990b7a8ede64ccd0712808438d6490d63ce6b8704d6df5f/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:17fd241c0d50bacb7ce8ff77a30f94a2d0ca69434ba2e0187cf95a5414aeb7e1", size = 1105762, upload_time = "2025-04-15T16:52:55.245Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b9/3d201f819afc3b7a8cd7ebe645f1a17799603e2d62c968154518f79f4881/greenlet-3.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:7b17a26abc6a1890bf77d5d6b71c0999705386b00060d15c10b8182679ff2790", size = 1125173, upload_time = "2025-04-15T16:23:03.009Z" }, + { url = "https://files.pythonhosted.org/packages/80/7b/773a30602234597fc2882091f8e1d1a38ea0b4419d99ca7ed82c827e2c3a/greenlet-3.2.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:397b6bbda06f8fe895893d96218cd6f6d855a6701dc45012ebe12262423cec8b", size = 269908, upload_time = "2025-04-15T16:20:33.58Z" }, ] [[package]] name = "h11" version = "0.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload_time = "2022-09-25T15:40:01.519Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload_time = "2022-09-25T15:39:59.68Z" }, ] [[package]] @@ -227,24 +210,24 @@ dependencies = [ { name = "h11" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c98ecdbfe04417e71e143bf2f2fb29128e4787d78d1cedba21bd250c7e7a/httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888", size = 62676 } +sdist = { url = "https://files.pythonhosted.org/packages/63/ad/c98ecdbfe04417e71e143bf2f2fb29128e4787d78d1cedba21bd250c7e7a/httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888", size = 62676, upload_time = "2023-07-05T12:09:31.29Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/2c/2bde7ff8dd2064395555220cbf7cba79991172bf5315a07eb3ac7688d9f1/httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87", size = 74513 }, + { url = "https://files.pythonhosted.org/packages/94/2c/2bde7ff8dd2064395555220cbf7cba79991172bf5315a07eb3ac7688d9f1/httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87", size = 74513, upload_time = "2023-07-05T12:09:29.425Z" }, ] [[package]] name = "httptools" version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, ] [[package]] @@ -257,27 +240,27 @@ dependencies = [ { name = "idna" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/2a/114d454cb77657dbf6a293e69390b96318930ace9cd96b51b99682493276/httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd", size = 81858 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/2a/114d454cb77657dbf6a293e69390b96318930ace9cd96b51b99682493276/httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd", size = 81858, upload_time = "2023-05-19T00:50:56.678Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/91/e41f64f03d2a13aee7e8c819d82ee3aa7cdc484d18c0ae859742597d5aa0/httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd", size = 75377 }, + { url = "https://files.pythonhosted.org/packages/ec/91/e41f64f03d2a13aee7e8c819d82ee3aa7cdc484d18c0ae859742597d5aa0/httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd", size = 75377, upload_time = "2023-05-19T00:50:54.91Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -287,9 +270,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] [[package]] @@ -304,7 +287,9 @@ dependencies = [ { name = "pathlib" }, { name = "platformdirs" }, { name = "pytest" }, - { name = "pytest-cov" }, + { name = "python-dotenv" }, + { name = "python-jose" }, + { name = "python-multipart" }, { name = "pyyaml" }, { name = "requests" }, { name = "sqlalchemy" }, @@ -320,7 +305,9 @@ requires-dist = [ { name = "pathlib", specifier = ">=1.0.1" }, { name = "platformdirs", specifier = ">=4.3.7" }, { name = "pytest", specifier = "==7.4.0" }, - { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "python-jose", specifier = ">=3.4.0" }, + { name = "python-multipart", specifier = ">=0.0.20" }, { name = "pyyaml", specifier = ">=6.0.2" }, { name = "requests", specifier = ">=2.32.3" }, { name = "sqlalchemy", specifier = ">=2.0.40" }, @@ -334,10 +321,10 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/bb/4bbc803fbdafedbfba015f7cc1ab1e87a6d1de36725ba058c53e2f8a45ad/mariadb-1.1.12.tar.gz", hash = "sha256:50b02ff2c78b1b4f4628a054e3c8c7dd92972137727a5cc309a64c9ed20c878c", size = 85934 } +sdist = { url = "https://files.pythonhosted.org/packages/17/bb/4bbc803fbdafedbfba015f7cc1ab1e87a6d1de36725ba058c53e2f8a45ad/mariadb-1.1.12.tar.gz", hash = "sha256:50b02ff2c78b1b4f4628a054e3c8c7dd92972137727a5cc309a64c9ed20c878c", size = 85934, upload_time = "2025-02-13T13:11:48.642Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/1b/b6eca3870ac1b5577a10d3b49ba42ac263c2e5718c9224cc1c8463940422/mariadb-1.1.12-cp313-cp313-win32.whl", hash = "sha256:ba43c42130d41352f32a5786c339cc931d05472ef7640fa3764d428dc294b88e", size = 184338 }, - { url = "https://files.pythonhosted.org/packages/fb/ff/c29a543ee1f9009755bc304138f61cd9b0ee1f14533e446513f84ccf143a/mariadb-1.1.12-cp313-cp313-win_amd64.whl", hash = "sha256:b69bc18418e72fcf359d17736cdc3f601a271203aff13ef7c57a415c8fd52ab0", size = 201272 }, + { url = "https://files.pythonhosted.org/packages/2b/1b/b6eca3870ac1b5577a10d3b49ba42ac263c2e5718c9224cc1c8463940422/mariadb-1.1.12-cp313-cp313-win32.whl", hash = "sha256:ba43c42130d41352f32a5786c339cc931d05472ef7640fa3764d428dc294b88e", size = 184338, upload_time = "2025-02-13T13:11:34.935Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ff/c29a543ee1f9009755bc304138f61cd9b0ee1f14533e446513f84ccf143a/mariadb-1.1.12-cp313-cp313-win_amd64.whl", hash = "sha256:b69bc18418e72fcf359d17736cdc3f601a271203aff13ef7c57a415c8fd52ab0", size = 201272, upload_time = "2025-02-13T13:11:38.074Z" }, ] [[package]] @@ -347,82 +334,91 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload_time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload_time = "2025-04-19T11:48:57.875Z" }, ] [[package]] name = "pathlib" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz", hash = "sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f", size = 49298 } +sdist = { url = "https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz", hash = "sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f", size = 49298, upload_time = "2014-09-03T15:41:57.18Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/f9/690a8600b93c332de3ab4a344a4ac34f00c8f104917061f779db6a918ed6/pathlib-1.0.1-py3-none-any.whl", hash = "sha256:f35f95ab8b0f59e6d354090350b44a80a80635d22efdedfa84c7ad1cf0a74147", size = 14363 }, + { url = "https://files.pythonhosted.org/packages/78/f9/690a8600b93c332de3ab4a344a4ac34f00c8f104917061f779db6a918ed6/pathlib-1.0.1-py3-none-any.whl", hash = "sha256:f35f95ab8b0f59e6d354090350b44a80a80635d22efdedfa84c7ad1cf0a74147", size = 14363, upload_time = "2022-05-04T13:37:20.585Z" }, ] [[package]] name = "platformdirs" version = "4.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291, upload_time = "2025-03-19T20:36:10.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499, upload_time = "2025-03-19T20:36:09.038Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/db/fffec68299e6d7bad3d504147f9094830b704527a7fc098b721d38cc7fa7/pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", size = 146820, upload_time = "2019-11-16T17:27:38.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", size = 77145, upload_time = "2019-11-16T17:27:11.07Z" }, ] [[package]] @@ -435,9 +431,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, ] [[package]] @@ -447,34 +443,34 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, ] [[package]] name = "pygments" version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, ] [[package]] @@ -487,57 +483,58 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/f3/dadfbdbf6b6c8b5bd02adb1e08bc9fbb45ba51c68b0893fa536378cdf485/pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a", size = 1349733 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/f3/dadfbdbf6b6c8b5bd02adb1e08bc9fbb45ba51c68b0893fa536378cdf485/pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a", size = 1349733, upload_time = "2023-06-23T11:17:28.791Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/b2/741130cbcf2bbfa852ed95a60dc311c9e232c7ed25bac3d9b8880a8df4ae/pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", size = 323580 }, -] - -[[package]] -name = "pytest-cov" -version = "6.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "coverage" }, - { name = "pytest" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841 }, + { url = "https://files.pythonhosted.org/packages/33/b2/741130cbcf2bbfa852ed95a60dc311c9e232c7ed25bac3d9b8880a8df4ae/pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", size = 323580, upload_time = "2023-06-23T11:17:25.738Z" }, ] [[package]] name = "python-dotenv" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload_time = "2025-03-25T10:14:56.835Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload_time = "2025-03-25T10:14:55.034Z" }, +] + +[[package]] +name = "python-jose" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ecdsa" }, + { name = "pyasn1" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/a0/c49687cf40cb6128ea4e0559855aff92cd5ebd1a60a31c08526818c0e51e/python-jose-3.4.0.tar.gz", hash = "sha256:9a9a40f418ced8ecaf7e3b28d69887ceaa76adad3bcaa6dae0d9e596fec1d680", size = 92145, upload_time = "2025-02-18T17:26:41.985Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/b0/2586ea6b6fd57a994ece0b56418cbe93fff0efb85e2c9eb6b0caf24a4e37/python_jose-3.4.0-py2.py3-none-any.whl", hash = "sha256:9c9f616819652d109bd889ecd1e15e9a162b9b94d682534c9c2146092945b78f", size = 34616, upload_time = "2025-02-18T17:26:40.826Z" }, ] [[package]] name = "python-multipart" version = "0.0.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -550,9 +547,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -563,9 +560,9 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, ] [[package]] @@ -577,36 +574,57 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/ea/13945d58d556a28dfb0f774ad5c8af759527390e59505a40d164bf8ce1ce/rich_toolkit-0.14.1.tar.gz", hash = "sha256:9248e2d087bfc01f3e4c5c8987e05f7fa744d00dd22fa2be3aa6e50255790b3f", size = 104416 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/ea/13945d58d556a28dfb0f774ad5c8af759527390e59505a40d164bf8ce1ce/rich_toolkit-0.14.1.tar.gz", hash = "sha256:9248e2d087bfc01f3e4c5c8987e05f7fa744d00dd22fa2be3aa6e50255790b3f", size = 104416, upload_time = "2025-03-30T12:19:08.623Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/e8/61c5b12d1567fdba41a6775db12a090d88b8305424ee7c47259c70d33cb4/rich_toolkit-0.14.1-py3-none-any.whl", hash = "sha256:dc92c0117d752446d04fdc828dbca5873bcded213a091a5d3742a2beec2e6559", size = 24177 }, + { url = "https://files.pythonhosted.org/packages/66/e8/61c5b12d1567fdba41a6775db12a090d88b8305424ee7c47259c70d33cb4/rich_toolkit-0.14.1-py3-none-any.whl", hash = "sha256:dc92c0117d752446d04fdc828dbca5873bcded213a091a5d3742a2beec2e6559", size = 24177, upload_time = "2025-03-30T12:19:07.307Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -617,17 +635,17 @@ dependencies = [ { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299 } +sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299, upload_time = "2025-03-27T17:52:31.876Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887 }, - { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367 }, - { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806 }, - { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131 }, - { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364 }, - { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482 }, - { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704 }, - { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564 }, - { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894 }, + { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887, upload_time = "2025-03-27T18:40:05.461Z" }, + { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367, upload_time = "2025-03-27T18:40:07.182Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806, upload_time = "2025-03-27T18:51:29.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131, upload_time = "2025-03-27T18:50:31.616Z" }, + { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364, upload_time = "2025-03-27T18:51:31.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482, upload_time = "2025-03-27T18:50:33.201Z" }, + { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704, upload_time = "2025-03-27T18:46:00.193Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564, upload_time = "2025-03-27T18:46:01.442Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894, upload_time = "2025-03-27T18:40:43.796Z" }, ] [[package]] @@ -638,9 +656,9 @@ dependencies = [ { name = "pydantic" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/4b/c2ad0496f5bdc6073d9b4cef52be9c04f2b37a5773441cc6600b1857648b/sqlmodel-0.0.24.tar.gz", hash = "sha256:cc5c7613c1a5533c9c7867e1aab2fd489a76c9e8a061984da11b4e613c182423", size = 116780 } +sdist = { url = "https://files.pythonhosted.org/packages/86/4b/c2ad0496f5bdc6073d9b4cef52be9c04f2b37a5773441cc6600b1857648b/sqlmodel-0.0.24.tar.gz", hash = "sha256:cc5c7613c1a5533c9c7867e1aab2fd489a76c9e8a061984da11b4e613c182423", size = 116780, upload_time = "2025-03-07T05:43:32.887Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/91/484cd2d05569892b7fef7f5ceab3bc89fb0f8a8c0cde1030d383dbc5449c/sqlmodel-0.0.24-py3-none-any.whl", hash = "sha256:6778852f09370908985b667d6a3ab92910d0d5ec88adcaf23dbc242715ff7193", size = 28622 }, + { url = "https://files.pythonhosted.org/packages/16/91/484cd2d05569892b7fef7f5ceab3bc89fb0f8a8c0cde1030d383dbc5449c/sqlmodel-0.0.24-py3-none-any.whl", hash = "sha256:6778852f09370908985b667d6a3ab92910d0d5ec88adcaf23dbc242715ff7193", size = 28622, upload_time = "2025-03-07T05:43:30.37Z" }, ] [[package]] @@ -650,9 +668,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload_time = "2025-04-13T13:56:17.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload_time = "2025-04-13T13:56:16.21Z" }, ] [[package]] @@ -665,18 +683,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711, upload_time = "2025-02-27T19:17:34.807Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061, upload_time = "2025-02-27T19:17:32.111Z" }, ] [[package]] name = "typing-extensions" version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, ] [[package]] @@ -686,18 +704,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, ] [[package]] name = "urllib3" version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload_time = "2025-04-10T15:23:39.232Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload_time = "2025-04-10T15:23:37.377Z" }, ] [[package]] @@ -708,9 +726,9 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, ] [package.optional-dependencies] @@ -728,14 +746,14 @@ standard = [ name = "uvloop" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload_time = "2024-10-14T23:38:35.489Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload_time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload_time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload_time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload_time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload_time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload_time = "2024-10-14T23:38:10.888Z" }, ] [[package]] @@ -745,38 +763,38 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537 } +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload_time = "2025-04-08T10:36:26.722Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531 }, - { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417 }, - { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423 }, - { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185 }, - { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696 }, - { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327 }, - { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741 }, - { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995 }, - { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693 }, - { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677 }, - { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804 }, - { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087 }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload_time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload_time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload_time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload_time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload_time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload_time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload_time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload_time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload_time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload_time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload_time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload_time = "2025-04-08T10:35:52.458Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, ]