diff --git a/djaosdb/base.py b/djaosdb/base.py index 9fdff29e0d6dfca73feca12b9cc0e2735d894851..67bfd8aabc82c0d07f8ad44037142c48ebbd630b 100644 --- a/djaosdb/base.py +++ b/djaosdb/base.py @@ -171,7 +171,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): # is created. if self.client_connection is not None: self.client_connection.close() - logger.debug('Existing MongoClient connection closed') + logger.debug('Existing CaosDBClient connection closed') self.client_connection = Database.connect(db=name, **connection_params) logger.debug('New Database connection') @@ -208,7 +208,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): if self.connection: with self.wrap_database_errors: self.connection.client.close() - logger.debug('MongoClient connection closed') + logger.debug('CaosDBClient connection closed') def _rollback(self): raise Error diff --git a/djaosdb/caosdb_client.py b/djaosdb/caosdb_client.py new file mode 100644 index 0000000000000000000000000000000000000000..d77411574bc72461a6f1ead71ccf04b144adc3b9 --- /dev/null +++ b/djaosdb/caosdb_client.py @@ -0,0 +1,7 @@ +from logging import getLogger + +logger = getLogger(__name__) + +class CaosDBClient: + def __init__(self, **kwargs): + logger.info("New CaosDBClient: {}".format(kwargs)) diff --git a/djaosdb/database.py b/djaosdb/database.py index cfa4f52934212ff7a77ff34509d7a22f35616bd4..fffa9903028714d0d1a9e1f7351275c45773de14 100644 --- a/djaosdb/database.py +++ b/djaosdb/database.py @@ -1,5 +1,5 @@ +from .caosdb_client import CaosDBClient from logging import getLogger -from caosdb import MongoClient logger = getLogger(__name__) clients = {} @@ -9,8 +9,8 @@ def connect(db, **kwargs): try: return clients[db] except KeyError: - logger.debug('New MongoClient connection') - clients[db] = MongoClient(**kwargs, connect=False) + logger.debug('New CaosDBClient connection') + clients[db] = CaosDBClient(**kwargs, connect=False) return clients[db] diff --git a/djaosdb/introspection.py b/djaosdb/introspection.py index 6bae9a96586ddc1766e2604ad1a6a454e4b50be7..1066f1a028ac286115152c3739fb4f9c6a31ad9c 100644 --- a/djaosdb/introspection.py +++ b/djaosdb/introspection.py @@ -1,20 +1,25 @@ import collections import datetime -import bson +# import bson +from .models.fields import ObjectId from django.db.backends.base.introspection import BaseDatabaseIntrospection, FieldInfo, TableInfo from django.db.models import Index +class Int64: + pass + + class DatabaseIntrospection(BaseDatabaseIntrospection): SAMPLE_SIZE = 10000 TYPE_MAPPING = { - int: bson.int64.Int64, + int: Int64, } data_types_reverse = { - bson.int64.Int64: 'BigIntegerField', - bson.objectid.ObjectId: 'ObjectIdField', + Int64: 'BigIntegerField', + ObjectId: 'ObjectIdField', collections.OrderedDict: 'JSONField', datetime.date: 'DateField', datetime.datetime: 'DateTimeField', @@ -107,4 +112,4 @@ class DatabaseIntrospection(BaseDatabaseIntrospection): default=None ) ) - return columns \ No newline at end of file + return columns diff --git a/djaosdb/models/fields.py b/djaosdb/models/fields.py index 275f28ebaebc12e4d8bcd815615e514bf1c4adba..94a6061ee233f6c5a3fe64c2ce6da419e65a10b7 100644 --- a/djaosdb/models/fields.py +++ b/djaosdb/models/fields.py @@ -17,7 +17,7 @@ import functools import json import typing -from bson import ObjectId +# from bson import ObjectId from django import forms from django.core.exceptions import ValidationError from django.db import connections as caosdb_connections @@ -40,6 +40,10 @@ if django_major >= 3: from django.db.models.fields import AutoFieldMixin, AutoFieldMeta +class ObjectId: + pass + + def make_mdl(model, model_dict): """ Builds an instance of model from the model_dict. diff --git a/djaosdb/sql2mongo/query.py b/djaosdb/sql2mongo/query.py index a65dd6145453eb2d22b54ac84a614e2d67fee6ae..9ed87019f5360cb6831bfcbe75e5e9e1dd3e1d6d 100644 --- a/djaosdb/sql2mongo/query.py +++ b/djaosdb/sql2mongo/query.py @@ -4,15 +4,16 @@ SQL constructors. """ import abc import re +import enum from logging import getLogger from typing import Optional, Dict, List, Union as U, Sequence, Set from dataclasses import dataclass, field as dataclass_field -from caosdb import MongoClient -from caosdb import ReturnDocument -from caosdb.command_cursor import CommandCursor -from caosdb.cursor import Cursor as BasicCursor -from caosdb.database import Database -from caosdb.errors import OperationFailure, CollectionInvalid +# from caosdb import ReturnDocument +# from caosdb.command_cursor import CommandCursor +# from caosdb.cursor import Cursor as BasicCursor +# from caosdb.database import Database +# from caosdb.errors import OperationFailure, CollectionInvalid +from caosdb import CaosDBException from sqlparse import parse as sqlparse from sqlparse import tokens from sqlparse.sql import ( @@ -20,6 +21,7 @@ from sqlparse.sql import ( Where, Statement) +from ..caosdb_client import CaosDBClient from ..exceptions import SQLDecodeError, MigrationError, print_warn from .functions import SQLFunc from .sql_tokens import (SQLToken, SQLStatement, SQLIdentifier, @@ -34,6 +36,15 @@ from djaosdb import base logger = getLogger(__name__) +class ReturnDocument(enum.Enum): + AFTER = 1 + +class BasicCursor: + pass + +class CommandCursor(BasicCursor): + pass + @dataclass class TokenAlias: alias2token: Dict[str, U[AliasableToken, @@ -47,7 +58,7 @@ class TokenAlias: class BaseQuery(abc.ABC): def __init__(self, - db: Database, + db: str, connection_properties: 'base.DjongoClient', statement: Statement, params: Sequence): @@ -655,7 +666,8 @@ class CreateQuery(DDLQuery): table = SQLToken.token2sql(tok, self).table try: self.db.create_collection(table) - except CollectionInvalid: + # except CollectionInvalid: + except CaosDBException as e: if self.connection_properties.enforce_schema: raise else: @@ -765,8 +777,8 @@ class DeleteQuery(DMLQuery): class Query: def __init__(self, - client_connection: MongoClient, - db_connection: Database, + client_connection: CaosDBClient, + db_connection: str, connection_properties: 'base.DjongoClient', sql: str, params: Optional[Sequence]): @@ -809,7 +821,8 @@ class Query: except MigrationError: raise - except OperationFailure as e: + # except OperationFailure as e: + except CaosDBException as e: import djaosdb exe = SQLDecodeError( f'FAILED SQL: {self._sql}\n' @@ -858,7 +871,8 @@ class Query: except MigrationError: raise - except OperationFailure as e: + # except OperationFailure as e: + except CaosDBException as e: import djaosdb exe = SQLDecodeError( err_sql=self._sql, diff --git a/djaosdb/sql2mongo/sql_tokens.py b/djaosdb/sql2mongo/sql_tokens.py index 6dc99b3bfdfeb75e65201b02c4443145f31d8f86..7fb8e54b805d56d6699033877c994c926a5f08bd 100644 --- a/djaosdb/sql2mongo/sql_tokens.py +++ b/djaosdb/sql2mongo/sql_tokens.py @@ -1,7 +1,7 @@ import abc import re from typing import Union as U, Iterator, Optional as O -from caosdb import ASCENDING, DESCENDING +# from caosdb import ASCENDING, DESCENDING from sqlparse import tokens, parse as sqlparse from sqlparse.sql import Token, Identifier, Function, Comparison, Parenthesis, IdentifierList, Statement from . import query as query_module @@ -407,7 +407,9 @@ class SQLColumnConstraint(SQLColumnDef): pass +ASCENDING = 1 +DESCENDING = -1 ORDER_BY_MAP = { 'ASC': ASCENDING, 'DESC': DESCENDING -} \ No newline at end of file +} diff --git a/djaosdb/storage.py b/djaosdb/storage.py deleted file mode 100644 index b2744498cad019c776d7891a06ba11005a0fac6f..0000000000000000000000000000000000000000 --- a/djaosdb/storage.py +++ /dev/null @@ -1,180 +0,0 @@ -import os -from urllib.parse import urljoin - -from bson import ObjectId -from bson.errors import InvalidId -from django.core.exceptions import ImproperlyConfigured -from django.core.files.storage import Storage -from django.utils.deconstruct import deconstructible -from django.utils.encoding import filepath_to_uri - -from gridfs import GridFS, NoFile - - -def _get_subcollections(collection): - """ - Returns all sub-collections of `collection`. - """ - # XXX: Use the MongoDB API for this once it exists. - for name in collection.database.collection_names(): - cleaned = name[:name.rfind('.')] - if cleaned != collection.name and cleaned.startswith(collection.name): - yield cleaned - - -@deconstructible -class GridFSStorage(Storage): - """ - GridFS Storage backend for Django. - Based on https://github.com/django-nonrel/mongodb-engine/blob/master/django_mongodb_engine/storage.py - - This backend aims to add a GridFS storage to upload files to - using Django's file fields. - - For performance, the file hierarchy is represented as a tree of - MongoDB sub-collections. - - (One could use a flat list, but to list a directory '/this/path/' - we would have to execute a search over the whole collection and - then filter the results to exclude those not starting by - '/this/path' using that model.) - - :param location: - (optional) Name of the top-level node that holds the files. This - value of `location` is prepended to all file paths, so it works - like the `location` setting for Django's built-in - :class:`~django.core.files.storage.FileSystemStorage`. - :param collection: - Name of the collection the file tree shall be stored in. - Defaults to 'storage'. - :param database: - Alias of the Django database to use. Defaults to 'default' (the - default Django database). - :param base_url: - URL that serves the files in GridFS (for instance, through - nginx-gridfs). - Defaults to None (file not accessible through a URL). - """ - - def __init__(self, location='', collection='storage', database='default', - base_url=None): - self.location = location.strip(os.sep) - self.collection = collection - self.database = database - self.base_url = base_url - - if not self.collection: - raise ImproperlyConfigured("'collection' may not be empty.") - - if self.base_url and not self.base_url.endswith('/'): - raise ImproperlyConfigured("If set, 'base_url' must end with a " - "slash.") - - def _open(self, path, mode='rb'): - """ - Returns a :class:`~gridfs.GridOut` file opened in `mode`, or - raises :exc:`~gridfs.errors.NoFile` if the requested file - doesn't exist and mode is not 'w'. - """ - gridfs, filename = self._get_gridfs(path) - try: - return gridfs.get_last_version(filename) - except NoFile: - if 'w' in mode: - return gridfs.new_file(filename=filename) - else: - raise - - def _save(self, path, content): - """ - Saves `content` into the file at `path`. - """ - gridfs, filename = self._get_gridfs(path) - gridfs.put(content, filename=filename, contentType=content.content_type) - return path - - def delete(self, path): - """ - Deletes the file at `path` if it exists. - """ - gridfs, filename = self._get_gridfs(path) - try: - gridfs.delete(gridfs.get_last_version(filename=filename).__getattribute__('_id')) - except NoFile: - pass - - def exists(self, path): - """ - Returns `True` if the file at `path` exists in GridFS. - """ - gridfs, filename = self._get_gridfs(path) - return gridfs.exists(filename=filename) - - def listdir(self, path): - """ - Returns a tuple (folders, lists) that are contained in the - folder `path`. - """ - gridfs, filename = self._get_gridfs(path) - assert not filename - subcollections = _get_subcollections(gridfs.__getattribute__('__collection')) - return set(c.split('.')[-1] for c in subcollections), gridfs.list() - - def size(self, path): - """ - Returns the size of the file at `path`. - """ - gridfs, filename = self._get_gridfs(path) - return gridfs.get_last_version(filename=filename).length - - def url(self, name): - if self.base_url is None: - raise ValueError("This file is not accessible via a URL.") - gridfs, filename = self._get_gridfs(name) - try: - file_oid = gridfs.get_last_version(filename=name).__getattr__('_id') - except NoFile: - # In case not found by filename - try: - # Check is a valid ObjectId - file_oid = ObjectId(name) - except (InvalidId, TypeError, ValueError): - return None - # Check if exist a file with that ObjectId - if not gridfs.exists(file_oid): - return None - return urljoin(self.base_url, filepath_to_uri(str(file_oid))) - - def created_time(self, path): - """ - Returns the datetime the file at `path` was created. - """ - gridfs, filename = self._get_gridfs(path) - return gridfs.get_last_version(filename=filename).upload_date - - def _get_gridfs(self, path): - """ - Returns a :class:`~gridfs.GridFS` using the sub-collection for - `path`. - """ - path, filename = os.path.split(path) - path = os.path.join(self.collection, self.location, path.strip(os.sep)) - collection_name = path.replace(os.sep, '.').strip('.') - - if not hasattr(self, '_db'): - from django.db import connections - self._db = connections[self.database].connection - - return GridFS(self._db, collection_name), filename - - def get_accessed_time(self, name): - pass - - def get_created_time(self, name): - pass - - def get_modified_time(self, name): - pass - - def path(self, name): - pass diff --git a/docs/Gemfile b/docs/Gemfile deleted file mode 100644 index a07c9c51d6012fbf4caf3e3f8e2c8b4a047e14f1..0000000000000000000000000000000000000000 --- a/docs/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -source 'https://rubygems.org' - -# gem stripe -# run locally - gem 'github-pages', group: :jekyll_plugins - gem "jekyll-include-cache" - -# run server -# gem "minimal-mistakes-jekyll" -# gem "jekyll", "~> 3.5" -# gem 'wdm' diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index d86c5a4301b12af1441fa8c4fb79e21cde138b6b..0000000000000000000000000000000000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,167 +0,0 @@ -remote_theme: "mmistakes/minimal-mistakes" - -#theme: minimal-mistakes-jekyll - -minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" - -# Site Settings -locale : "en-US" -title_separator : "-" -name : "Nesdis" -description : "Djongo is specifically meant to be used with the original Django ORM and MongoDB. Using the Django admin app one can directly add and modify documents stored in MongoDB. Other contrib modules such as Auth and Sessions work without any changes" -url : "https://nesdis.github.io" -baseurl : "/djaosdb" -repository : "nesdis/djaosdb" -teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" -# breadcrumbs : false # true, false (default) -logo : "/assets/images/djaosdb-logo.png" -words_per_minute : 200 -comments: - provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "staticman_v2" "custom" - disqus: - shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname- - discourse: - server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org - facebook: - # https://developers.facebook.com/docs/plugins/comments - appid : - num_posts : # 5 (default) - colorscheme : # "light" (default), "dark" - -footer: - links: - - label: By continuing to use this site, you consent to our use of cookies for tracking site usage. - url: "/privacy-policy" - -# SEO Related -google_site_verification : -bing_site_verification : -yandex_site_verification : -naver_site_verification : - -# Analytics -analytics: - provider : "google-universal" # false (default), "google", "google-universal", "custom" - google: - tracking_id : "UA-75159067-1" - -#footer_scripts: -# - /assets/js/jquery.easing.min.js -# - /assets/js/jquery.touchSwipe.min.js -# - /assets/js/jquery.liquid-slider.min.js - -head_scripts: - - "https://js.stripe.com/v3/" - -# Reading Files -include: [_static, _sources] - -exclude: - - "*.sublime-project" - - "*.sublime-workspace" - - vendor - - .asset-cache - - .bundle - - .jekyll-assets-cache - - .sass-cache - - assets/js/plugins - - assets/js/_main.js - - assets/js/vendor - - Capfile - - CHANGELOG - - config - - Gemfile - - Gruntfile.js - - gulpfile.js - - LICENSE - - log - - node_modules - - package.json - - Rakefile - - README - - tmp - -keep_files: - - .git - - .svn - - -encoding: "utf-8" -markdown_ext: "markdown,mkdown,mkdn,mkd,md" - - -# Conversion -markdown: kramdown -highlighter: rouge -lsi: false -excerpt_separator: "\n\n" -incremental: false - - -# Markdown Processing -kramdown: - input: GFM - hard_wrap: false - auto_ids: true - footnote_nr: 1 - entity_output: as_char - toc_levels: 1..6 - smart_quotes: lsquo,rsquo,ldquo,rdquo - enable_coderay: false - - -# Sass/SCSS -sass: - sass_dir: _sass - style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style - - -# Outputting -#permalink: /:categories/:title/ -#paginate_path: /blog/page:num/ -#paginate: 5 # amount of posts to show -timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - - -# Plugins (previously gems:) -plugins: -# - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jemoji - - jekyll-include-cache - - jekyll-redirect-from - -# mimic GitHub Pages with --safe -whitelist: -# - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jemoji - - -# HTML Compression -# - http://jch.penibelst.de/ -compress_html: - clippings: all - ignore: - envs: development - -# Defaults -defaults: - - scope: - path: "docs" - type: pages - values: - notice: - not_ready: "Parts of this feature are still under development.\n{: .notice--warning}" - sponsor: "**Note:** If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support and [advertisement space][sponsor_page].\n{: .notice--danger}" - layout: single - read_time: false - author_profile: false - share: false - comments: false - toc: true - sidebar: - nav: "docs" - diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml deleted file mode 100644 index 8e118a80e517dfb32769e514d873f5eb0a10f65a..0000000000000000000000000000000000000000 --- a/docs/_data/navigation.yml +++ /dev/null @@ -1,61 +0,0 @@ -# main links -main: - - title: "Get Started" - url: /get-started/ - - title: "Sponsor" - url: /sponsor/ - - title: "Discuss" - url: /discuss/ - - title: "Source" - url: https://github.com/nesdis/djaosdb/ - -docs: - - title: "Usage" - children: - - title: "Get Started" - url: /get-started/ - - title: "Djongo Deep Dive" - url: /djaosdb-deep-dive/ - - title: "Djongo Fields" - children: - - title: "Embedded Field" - url: /using-django-with-mongodb-data-fields/ - - title: "Array Field" - url: /using-django-with-mongodb-array-field/ - - title: "Array Reference Field" - url: /using-django-with-mongodb-array-reference-field/ - - title: "Other fields" - url: /using-django-with-other-fields/ - - - title: "DjongoNxt" -# url: /djaosdbnxt/ - children: - - title: "Indexes" - url: /djaosdbnxt-indexes/ - - title: "Model Query" - url: /djaosdbnxt-model-query/ - - title: "Model Creation" - url: /djaosdbnxt-model-creation/ - - title: "Model Update" - url: /djaosdbnxt-model-update/ - - title: "Database Transactions" - url: /djaosdbnxt-database-transactions/ -# - title: "Aggregation" -# url: /djaosdbnxt-aggregation/ - - title: "Contact" - url: /djaosdbnxt-more-info/ - - title: "Get DjongoNxt" - url: /sponsor/ - - - title: "Side stuff" - children: - - title: "Djongo vs Others" - url: /djaosdb-comparison/ - - title: "Djongo Design" - url: /django-mongodb-connector-design-document/ -# - title: "Roadmap" -# url: /roadmap/ - -# - title: "Donate" -# url: /donate/ -# thumbnail: /djaosdb/assets/images/heart.png diff --git a/docs/_data/navigation2.yml b/docs/_data/navigation2.yml deleted file mode 100644 index 4ebf892028dedec84c8b30ca052ca13ce8023422..0000000000000000000000000000000000000000 --- a/docs/_data/navigation2.yml +++ /dev/null @@ -1,54 +0,0 @@ -# main links -main: - - title: "Get Started" - url: /get-started/ - - title: "Get The Source" - url: https://github.com/nesdis/djaosdb/ - - title: "Donate" - url: /donate/ - thumbnail: /djaosdb/assets/images/heart.png - -docs: - - title: "Get started" - url: /get-started/ - - - title: "Tutorial" - children: - - title: "Migrate existing MongoDB data" - url: /integrating-django-with-mongodb/ - - title: "MongoDB data fields" - url: /using-django-with-mongodb-data-fields/ - - title: "Array and List fields" - url: /using-django-with-mongodb-array-field/ - - title: "IMP Creating capped models" - url: /creating-django-capped-models-using-mongodb/ - - title: "IMP Overcoming Django Migrations" - url: /overcoming-django-migrations/ - - title: "Django Rest Framework and MongoDB" - url: /overcoming-django-migrations/ - - - title: "API Reference" - children: - - title: "Database configuration" - url: /database-configuration/ - - title: "Embedded Model Field" - url: /embedded-model-field/ - - title: "Array Model Field" - url: /array-model-field/ - - title: "List Field" - url: /other-fields/#ListField - - title: "Dict Field" - url: /dict-field/ - - title: "ObjectID Field" - url: /other-fields/#ObjectIdField - - title: "Array Reference Field" - url: /other-fields/#ArrayReferenceField - - - title: "Other resources" - children: - - title: "Different ways to integrate Django with MongoDBs" - url: /different-ways-to-integrate-django-with-mongodb/ - - title: "Djongo design documentation" - url: /django-mongodb-connector-design-document/ - - title: "Roadmap" - url: /roadmap/ diff --git a/docs/_data/ui-text.yml b/docs/_data/ui-text.yml deleted file mode 100644 index d6932ced7d436f4497298c59fd48fa9c41874d45..0000000000000000000000000000000000000000 --- a/docs/_data/ui-text.yml +++ /dev/null @@ -1,983 +0,0 @@ -# User interface text and labels - -# English (default) -# ----------------- -en: &DEFAULT_EN - page : "Page" - pagination_previous : "Previous" - pagination_next : "Next" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : "Toggle Menu" - toc_label : "On This Page" - ext_link_label : "Direct Link" - less_than : "less than" - minute_read : "minute read" - share_on_label : "Share on" - meta_label : - tags_label : "Tags:" - categories_label : "Categories:" - date_label : "Updated:" - comments_label : "Leave a Comment" - comments_title : "Comments" - more_label : "Learn More" - related_label : "You May Also Enjoy" -# follow_label : "Follow:" -# feed_label : "" - powered_by : "Powered by" - website_label : "Website" - email_label : "Email" - recent_posts : "Recent Posts" - undefined_wpm : "Undefined parameter words_per_minute at _config.yml" - comment_form_info : "Your email address will not be published. Required fields are marked" - comment_form_comment_label : "Comment" - comment_form_md_info : "Markdown is supported." - comment_form_name_label : "Name" - comment_form_email_label : "Email address" - comment_form_website_label : "Website (optional)" - comment_btn_submit : "Submit Comment" - comment_btn_submitted : "Submitted" - comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved." - comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." - loading_label : "Loading..." - search_placeholder_text : "Enter your search term..." - results_found : "Result(s) found" -en-US: - <<: *DEFAULT_EN -en-CA: - <<: *DEFAULT_EN -en-GB: - <<: *DEFAULT_EN -en-AU: - <<: *DEFAULT_EN - -# Spanish -# -------------- -es: &DEFAULT_ES - page : "Página" - pagination_previous : "Anterior" - pagination_next : "Siguiente" - breadcrumb_home_label : "Inicio" - breadcrumb_separator : "/" - menu_label : - toc_label : "Contenidos" - ext_link_label : "Enlace" - less_than : "menos de" - minute_read : "minuto de lectura" - share_on_label : "Compartir" - meta_label : - tags_label : "Etiquetas:" - categories_label : "Categorías:" - date_label : "Actualizado:" - comments_label : "Comentar" - comments_title : - more_label : "Ver más" - related_label : "Podrías ver también" - follow_label : "Seguir:" - feed_label : "Feed" - powered_by : "Powered by" - website_label : "Sitio web" - email_label : "Email" - recent_posts : "Entradas recientes" - undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml" - comment_form_info : "Su dirección de correo no será publicada. Se han resaltado los campos requeridos" - comment_form_comment_label : "Comentario" - comment_form_md_info : "Markdown está soportado." - comment_form_name_label : "Nombre" - comment_form_email_label : "Dirección de E-mail" - comment_form_website_label : "Sitio web (opcional)" - comment_btn_submit : "Enviar Commentario" - comment_btn_submitted : "Enviado" - comment_success_msg : "Gracias por su comentario!, Este se visualizará en el sitio una vez haya sido aprobado" - comment_error_msg : "Lo sentimos, ha ocurrido un error al enviar su comentario. Por favor asegurese que todos los campos han sido diligenciados e intente de nuevo" - loading_label : "Cargando..." -es-ES: - <<: *DEFAULT_ES -es-CO: - <<: *DEFAULT_ES - -# French -# ----------------- -fr: &DEFAULT_FR - page : "Page" - pagination_previous : "Précédent" - pagination_next : "Suivant" - breadcrumb_home_label : "Accueil" - breadcrumb_separator : "/" - menu_label : - toc_label : "Sur cette page" - ext_link_label : "Lien direct" - less_than : "moins de" - minute_read : "minute de lecture" - share_on_label : "Partager sur" - meta_label : - tags_label : "Tags :" - categories_label : "Catégories :" - date_label : "Mis à jour :" - comments_label : "Laisser un commentaire" - comments_title : - more_label : "Lire plus" - related_label : "Vous pourriez aimer aussi" - follow_label : "Contact" - feed_label : "Flux" - powered_by : "Propulsé par" - website_label : "Site" - email_label : "Email" - recent_posts : "Posts récents" - undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml" - comments_title : "Commentaires" - comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués" - comment_form_comment_label : "Commentaire" - comment_form_md_info : "Markdown est supporté." - comment_form_name_label : "Nom" - comment_form_email_label : "Adresse mail" - comment_form_website_label : "Site web (optionnel)" - comment_btn_submit : "Envoyer" - comment_btn_submitted : "Envoyé" - comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé." - comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez." - loading_label : "Chargement..." -fr-FR: - <<: *DEFAULT_FR -fr-BE: - <<: *DEFAULT_FR -fr-CH: - <<: *DEFAULT_FR - -# Turkish -# ----------------- -tr: &DEFAULT_TR - page : "Sayfa" - pagination_previous : "Önceki" - pagination_next : "Sonraki" - breadcrumb_home_label : "Ana Sayfa" - breadcrumb_separator : "/" - menu_label : - toc_label : "İçindekiler" - ext_link_label : "Doğrudan Bağlantı" - less_than : "Şu süreden az: " - minute_read : "dakika tahmini okuma süresi" - share_on_label : "Paylaş" - meta_label : - tags_label : "Etiketler:" - categories_label : "Kategoriler:" - date_label : "Güncelleme tarihi:" - comments_label : "Yorum yapın" - comments_title : "Yorumlar" - more_label : "Daha fazlasını öğrenin" - related_label : "Bunlar ilginizi çekebilir:" - follow_label : "Takip et:" - feed_label : "RSS" - powered_by : "Emeği geçenler: " - website_label : "Web sayfası" - email_label : "E-posta" - recent_posts : "Son yazılar" - undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi" - comment_form_info : "Email adresiniz gösterilmeyecektir. Zorunlu alanlar işaretlenmiştir" - comment_form_comment_label : "Yorumunuz" - comment_form_md_info : "Markdown desteklenmektedir." - comment_form_name_label : "Adınız" - comment_form_email_label : "Email adresiniz" - comment_form_website_label : "Websiteniz (opsiyonel)" - comment_btn_submit : "Yorum Yap" - comment_btn_submitted : "Gönderildi" - comment_success_msg : "Yorumunuz için teşekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir." - comment_error_msg : "Maalesef bir hata oluştu. Lütfen zorunlu olan tüm alanları doldurduğunuzdan emin olun ve sonrasında tekrar deneyin." - loading_label : "Yükleniyor..." -tr-TR: - <<: *DEFAULT_TR - -# Portuguese -pt: &DEFAULT_PT - page : "Página" - pagination_previous : "Anterior" - pagination_next : "Seguinte" - breadcrumb_home_label : "Início" - breadcrumb_separator : "/" - menu_label : - toc_label : "Nesta Página" - ext_link_label : "Link Direto" - less_than : "menos de" - minute_read : "minutos de leitura" - share_on_label : "Partilhar no" - meta_label : - tags_label : "Etiquetas:" - categories_label : "Categorias:" - date_label : "Atualizado:" - comments_label : "Deixe um Comentário" - comments_title : "Comentários" - more_label : "Saber mais" - related_label : "Também pode gostar de" - follow_label : "Siga:" - feed_label : "Feed" - powered_by : "Feito com" - website_label : "Site" - email_label : "Email" - recent_posts : "Artigos Recentes" - undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml" - comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados" - comment_form_comment_label : "Comentário" - comment_form_md_info : "Markdown é suportado." - comment_form_name_label : "Nome" - comment_form_email_label : "Endereço Email" - comment_form_website_label : "Site (opcional)" - comment_btn_submit : "Sumbeter Comentário" - comment_btn_submitted : "Submetido" - comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado." - comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente." - loading_label : "A carregar..." -pt-PT: - <<: *DEFAULT_PT - -# Brazilian Portuguese -pt-BR: - page : "Página" - pagination_previous : "Anterior" - pagination_next : "Próxima" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : - toc_label : "Nesta página" - ext_link_label : "Link direto" - less_than : "menos que" - minute_read : "minuto(s) de leitura" - share_on_label : "Compartilhe em" - meta_label : - tags_label : "Tags:" - categories_label : "Categorias:" - date_label : "Atualizado em:" - comments_label : "Deixe um comentário" - comments_title : - more_label : "Aprenda mais" - related_label : "Talvez você goste também" - follow_label : "Acompanhe em" - feed_label : "Feed" - powered_by : "Feito com" - website_label : "Site" - email_label : "Email" - recent_posts : "Postagens recentes" - undefined_wpm : "Parâmetro indefinido em words_per_minute no _config.yml" - comment_form_info : "Seu email não será publicado. Os campos obrigatórios estão marcados" - comment_form_comment_label : "Comentário" - comment_form_md_info : "Markdown é suportado." - comment_form_name_label : "Nome" - comment_form_email_label : "Email" - comment_form_website_label : "Site (opcional)" - comment_btn_submit : "Enviar Comentário" - comment_btn_submitted : "Enviado" - comment_success_msg : "Obrigado pelo seu comentário! Ele aparecerá no site assim que for aprovado." - comment_error_msg : "Desculpe, ocorreu um erro no envio. Por favor verifique se todos os campos obrigatórios foram preenchidos e tente novamente." - loading_label : "Carregando..." - -# Italian -# ----------------- -it: &DEFAULT_IT - page : "Pagina" - pagination_previous : "Precedente" - pagination_next : "Prossima" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : - toc_label : "Indice della pagina" - ext_link_label : "Link" - less_than : "meno di" - minute_read : "minuto/i di lettura" - share_on_label : "Condividi" - meta_label : - tags_label : "Tags:" - categories_label : "Categorie:" - date_label : "Aggiornato:" - comments_label : "Scrivi un commento" - comments_title : - more_label : "Scopri di più" - related_label : "Potrebbe Piacerti Anche" - follow_label : "Segui:" - feed_label : "Feed" - powered_by : "Powered by" - website_label : "Website" - email_label : "Email" - recent_posts : "Articoli Recenti" - undefined_wpm : "Parametro words_per_minute non definito in _config.yml" - comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori" - comment_form_comment_label : "Commenta" - comment_form_md_info : "Il linguaggio Markdown è supportato" - comment_form_name_label : "Nome" - comment_form_email_label : "Indirizzo email" - comment_form_website_label : "Sito Web (opzionale)" - comment_btn_submit : "Invia commento" - comment_btn_submitted : "Inviato" - comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato." - comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova." - loading_label : "Caricamento..." -it-IT: - <<: *DEFAULT_IT - -# Chinese (zh-CN Chinese - China) -# ----------------- -zh: &DEFAULT_ZH_HANS - page : "页面" - pagination_previous : "向前" - pagination_next : "向后" - breadcrumb_home_label : "首页" - breadcrumb_separator : "/" - menu_label : "切换菜单" - toc_label : "在本页上" - ext_link_label : "直接链接" - less_than : "少于" - minute_read : "分钟读完" - share_on_label : "分享" - meta_label : - tags_label : "标签:" - categories_label : "分类:" - date_label : "更新时间:" - comments_label : "留下评论" - comments_title : "评论" - more_label : "了解更多" - related_label : "猜您还喜欢" - follow_label : "关注:" - feed_label : "Feed" - powered_by : "技术来自于" - website_label : "网站" - email_label : "电子邮箱" - recent_posts : "最新文章" - undefined_wpm : "_config.yml配置中words_per_minute字段未定义" - comment_form_info : "您的电子邮箱地址并不会被展示。请填写标记为必须的字段。" - comment_form_comment_label : "评论" - comment_form_md_info : "Markdown语法已支持。" - comment_form_name_label : "姓名" - comment_form_email_label : "电子邮箱" - comment_form_website_label : "网站(可选)" - comment_btn_submit : "提交评论" - comment_btn_submitted : "已提交" - comment_success_msg : "感谢您的评论!被批准后它会立即在此站点展示。" - comment_error_msg : "很抱歉,您的提交存在错误。请确保所有必填字段都已填写正确,然后再试一次。" - loading_label : "正在加载..." -zh-CN: - <<: *DEFAULT_ZH_HANS -zh-SG: - <<: *DEFAULT_ZH_HANS -# Taiwan (Traditional Chinese) -zh-TW: &DEFAULT_ZH_HANT - page : "頁面" - pagination_previous : "較舊" - pagination_next : "較新" - breadcrumb_home_label : "首頁" - breadcrumb_separator : "/" - menu_label : "切換選單" - toc_label : "本頁" - ext_link_label : "外部連結" - less_than : "少於" - minute_read : "分鐘閱讀" - share_on_label : "分享到" - meta_label : - tags_label : "標籤:" - categories_label : "分類:" - date_label : "更新時間:" - comments_label : "留言" - comments_title : "留言內容" - more_label : "了解更多" - related_label : "猜您有與趣" - follow_label : "追蹤:" - feed_label : "RSS Feed" - powered_by : "Powered by" - website_label : "網站" - email_label : "電子信箱" - recent_posts : "最新文章" - undefined_wpm : "_config.yml 中未定義 words_per_minute" - comment_form_info : "您的電子信箱不會被公開. 必填部份已標記" - comment_form_comment_label : "留言內容" - comment_form_md_info : "支援Markdown語法。" - comment_form_name_label : "名字" - comment_form_email_label : "電子信箱帳號" - comment_form_website_label : "網頁 (可選填)" - comment_btn_submit : "送出留言" - comment_btn_submitted : "已送出" - comment_success_msg : "感謝您的留言! 審核後將會顯示在站上。" - comment_error_msg : "抱歉,部份資料輸入有問題。請確認資料填寫正確後再試一次。" - loading_label : "載入中..." -zh-HK: - <<: *DEFAULT_ZH_HANT -# German / Deutsch -# ----------------- -de: &DEFAULT_DE - page : "Seite" - pagination_previous : "Vorherige" - pagination_next : "Nächste" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : - toc_label : "Auf dieser Seite" - ext_link_label : "Direkter Link" - less_than : "weniger als" - minute_read : "Minuten zum lesen" - share_on_label : "Teilen auf" - meta_label : - tags_label : "Tags:" - categories_label : "Kategorien:" - date_label : "Aktualisiert:" - comments_label : "Hinterlassen sie einen Kommentar" - comments_title : "Kommentare" - more_label : "Mehr anzeigen" - related_label : "Ihnen gefällt vielleicht auch" - follow_label : "Folgen:" - feed_label : "Feed" - powered_by : "Powered by" - website_label : "Webseite" - email_label : "E-Mail" - recent_posts : "Aktuelle Beiträge" - undefined_wpm : "Undefinierter Parameter words_per_minute in _config.yml" - comment_form_info : "Ihre E-Mail Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert" - comment_form_comment_label : "Kommentar" - comment_form_md_info : "Markdown wird unterstützt." - comment_form_name_label : "Name" - comment_form_email_label : "E-Mail Addresse" - comment_form_website_label : "Webseite (optional)" - comment_btn_submit : "Kommentar absenden" - comment_btn_submitted : "Versendet" - comment_success_msg : "Danke für ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde." - comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen sie alle benötigten Felder aus und versuchen sie es erneut." - loading_label : "Lade..." -de-DE: - <<: *DEFAULT_DE -de-AT: - <<: *DEFAULT_DE -de-CH: - <<: *DEFAULT_DE -de-BE: - <<: *DEFAULT_DE -de-LI: - <<: *DEFAULT_DE -de-LU: - <<: *DEFAULT_DE - -# Nepali (Nepal) -# ----------------- -ne: &DEFAULT_NE - page : "पृष्ठ" - pagination_previous : "अघिल्लो" - pagination_next : "अर्को" - breadcrumb_home_label : "गृह" - breadcrumb_separator : "/" - menu_label : "टगल मेनु" - toc_label : "यो पृष्ठमा" - ext_link_label : "सिधा सम्पर्क" - less_than : "कम्तिमा" - minute_read : "मिनेट पढ्नुहोस्" - share_on_label : "शेयर गर्नुहोस्" - meta_label : - tags_label : "ट्यागहरू:" - categories_label : "वर्गहरु:" - date_label : "अद्यावधिक:" - comments_label : "टिप्पणी दिनुहोस्" - comments_title : "टिप्पणीहरू" - more_label : "अझै सिक्नुहोस्" - related_label : "तपाईं रुचाउन सक्नुहुन्छ " - follow_label : "पछ्याउनुहोस्:" - feed_label : "फिड" - powered_by : "Powered by" - website_label : "वेबसाइट" - email_label : "इमेल" - recent_posts : "ताजा लेखहरु" - undefined_wpm : "अपरिभाषित प्यारामिटर शब्दहरू_प्रति_मिनेट at _config.yml" - comment_form_info : "तपाइँको इमेल ठेगाना प्रकाशित गरिने छैन।आवश्यक जानकारीहरुमा चिन्ह लगाइको छ" - comment_form_comment_label : "टिप्पणी" - comment_form_md_info : "मार्कडाउन समर्थित छ।" - comment_form_name_label : "नाम" - comment_form_email_label : "इमेल ठेगाना" - comment_form_website_label : "वेबसाइट (वैकल्पिक)" - comment_btn_submit : "टिप्पणी दिनुहोस् " - comment_btn_submitted : "टिप्पणी भयो" - comment_success_msg : "तपाईंको टिप्पणीको लागि धन्यवाद! एक पटक यो अनुमोदन गरेपछी यो साइटमा देखाउनेछ।" - comment_error_msg : "माफ गर्नुहोस्, तपाईंको टिप्पणी त्रुटि थियो।सबै आवश्यक जानकारीहरु पूरा गरिएको छ भने निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।" - loading_label : "लोड हुँदैछ ..." -ne-NP: - <<: *DEFAULT_NE - -# Korean -# -------------- -ko: &DEFAULT_KO - page : "페이지" - pagination_previous : "이전" - pagination_next : "다음" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : "토글 메뉴" - toc_label : "On This Page" - ext_link_label : "직접 링크" - less_than : "최대" - minute_read : "분 소요" - share_on_label : "공유하기" - meta_label : - tags_label : "태그:" - categories_label : "카테고리:" - date_label : "업데이트:" - comments_label : "댓글남기기" - comments_title : "댓글" - more_label : "더 보기" - related_label : "참고" - follow_label : "팔로우:" - feed_label : "피드" - powered_by : "Powered by" - website_label : "웹사이트" - email_label : "이메일" - recent_posts : "최근 포스트" - undefined_wpm : "Undefined parameter words_per_minute at _config.yml" - comment_form_info : "이메일은 공개되지 않습니다. 작성 필요 필드:" - comment_form_comment_label : "댓글" - comment_form_md_info : "마크다운을 지원합니다." - comment_form_name_label : "이름" - comment_form_email_label : "이메일" - comment_form_website_label : "웹사이트(선택사항)" - comment_btn_submit : "댓글 등록" - comment_btn_submitted : "등록됨" - comment_success_msg : "감사합니다! 댓글이 머지된 후 확인하실 수 있습니다." - comment_error_msg : "댓글 등록에 문제가 있습니다. 필요 필드를 작성했는지 확인하고 다시 시도하세요." - loading_label : "로딩중..." -ko-KR: - <<: *DEFAULT_KO - -# Russian / Русский -# ----------------- -ru: &DEFAULT_RU - page : "Страница" - pagination_previous : "Предыдущая" - pagination_next : "Следующая" - breadcrumb_home_label : "Главная" - breadcrumb_separator : "/" - menu_label : "Выпадающее меню" - toc_label : "Содержание" - ext_link_label : "Прямая ссылка" - less_than : "менее" - minute_read : "мин на чтение" - share_on_label : "Поделиться" - meta_label : - tags_label : "Метки:" - categories_label : "Разделы:" - date_label : "Дата изменения:" - comments_label : "Оставить комментарий" - comments_title : "Комментарии" - more_label : "Читать далее" - related_label : "Вам также может понравиться" - follow_label : "Связаться со мной:" - feed_label : "RSS-лента" - powered_by : "Сайт работает на" - website_label : "Сайт" - email_label : "Электронная почта" - recent_posts : "Свежие записи" - undefined_wpm : "Не определён параметр words_per_minute в _config.yml" - comment_form_info : "Ваш адрес электронной почты не будет опубликован. Обязательные поля помечены" - comment_form_comment_label : "Комментарий" - comment_form_md_info : "Поддерживается синтаксис Markdown." - comment_form_name_label : "Имя" - comment_form_email_label : "Электронная почта" - comment_form_website_label : "Ссылка на сайт (необязательно)" - comment_btn_submit : "Оставить комментарий" - comment_btn_submitted : "Отправлено" - comment_success_msg : "Спасибо за Ваш комментарий! Он будет опубликован на сайте после проверки." - comment_error_msg : "К сожалению, произошла ошибка с отправкой комментария. Пожалуйста, убедитесь, что все обязательные поля заполнены и попытайтесь снова." - loading_label : "Отправка..." - search_placeholder_text : "Введите поисковый запрос..." - results_found : "Найдено" -ru-RU: - <<: *DEFAULT_RU - -# Lithuanian / Lietuviškai -# ----------------- -lt: &DEFAULT_LT - page : "Puslapis" - pagination_previous : "Ankstesnis" - pagination_next : "Sekantis" - breadcrumb_home_label : "Pagrindinis" - breadcrumb_separator : "/" - menu_label : "Meniu rodymas" - toc_label : "Turinys" - ext_link_label : "Tiesioginė nuoroda" - less_than : "mažiau nei" - minute_read : "min. skaitymo" - share_on_label : "Pasidalinti" - meta_label : - tags_label : "Žymės:" - categories_label : "Kategorijos:" - date_label : "Atnaujinta:" - comments_label : "Palikti komentarą" - comments_title : "Komentaras" - more_label : "Skaityti daugiau" - related_label : "Taip pat turėtų patikti" - follow_label : "Sekti:" - feed_label : "Šaltinis" - powered_by : "Sukurta su" - website_label : "Tinklapis" - email_label : "El. paštas" - recent_posts : "Naujausi įrašai" - undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml" - comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti." - comment_form_comment_label : "Komentaras" - comment_form_md_info : "Markdown palaikomas." - comment_form_name_label : "Vardas" - comment_form_email_label : "El. paštas" - comment_form_website_label : "Tinklapis (nebūtina)" - comment_btn_submit : "Komentuoti" - comment_btn_submitted : "Įrašytas" - comment_success_msg : "Ačiū už komentarą! Jis bus parodytas kai bus patvirtintas." - comment_error_msg : "Atleiskite, įvyko netikėta klaida įrašant komentarą. Pasitikrinkite ar užpildėte visus būtinus laukus ir pamėginkite dar kartą." - loading_label : "Kraunama..." -lt-LT: - <<: *DEFAULT_LT - -# Greek -# -------------- -gr: &DEFAULT_GR - page : "Σελίδα" - pagination_previous : "Προηγούμενo" - pagination_next : "Επόμενo" - breadcrumb_home_label : "Αρχική" - breadcrumb_separator : "/" - menu_label : "Μενού" - toc_label : "Περιεχόμενα" - ext_link_label : "Εξωτερικός Σύνδεσμος" - less_than : "Λιγότερο από" - minute_read : "λεπτά ανάγνωσης" - share_on_label : "Μοιραστείτε το" - meta_label : - tags_label : "Ετικέτες:" - categories_label : "Κατηγορίες:" - date_label : "Ενημερώθηκε:" - comments_label : "Αφήστε ένα σχόλιο" - comments_title : "Σχόλια" - more_label : "Διάβαστε περισσότερα" - related_label : "Σχετικές αναρτήσεις" - follow_label : "Ακολουθήστε:" - feed_label : "RSS Feed" - powered_by : "Δημιουργήθηκε με" - website_label : "Ιστοσελίδα" - email_label : "Email" - recent_posts : "Τελευταίες αναρτήσεις" - undefined_wpm : "Δεν έχει οριστεί η παράμετρος words_per_minute στο αρχείο _config.yml" - comment_form_info : "Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα απαιτούμενα πεδία εμφανίζονται με αστερίσκο" - comment_form_comment_label : "Σχόλιο" - comment_form_md_info : "Το πεδίο υποστηρίζει Markdown." - comment_form_name_label : "Όνομα" - comment_form_email_label : "Διεύθυνση email" - comment_form_website_label : "Ιστοσελίδα (προαιρετικό)" - comment_btn_submit : "Υπόβαλε ένα σχόλιο" - comment_btn_submitted : "Έχει υποβληθεί" - comment_success_msg : "Ευχαριστούμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα αφού εγκριθεί." - comment_error_msg : "Λυπούμαστε, παρουσιάστηκε σφάλμα με την υποβολή σας. Παρακαλούμε βεβαιωθείτε ότι έχετε όλα τα απαιτούμενα πεδία συμπληρωμένα και δοκιμάστε ξανά." - loading_label : "Φόρτωση..." - search_placeholder_text : "Εισάγετε όρο αναζήτησης..." - results_found : "Αποτελέσματα" -gr-GR: - <<: *DEFAULT_GR - -# Swedish -# ----------------- -sv: &DEFAULT_SV - page : "Sidan" - pagination_previous : "Föregående" - pagination_next : "Nästa" - breadcrumb_home_label : "Hem" - breadcrumb_separator : "/" - menu_label : "Meny ridå" - toc_label : "På denna sida" - ext_link_label : "Direkt länk" - less_than : "mindre än" - minute_read : "minut läsning" - share_on_label : "Dela på" - meta_label : - tags_label : "Taggar:" - categories_label : "Kategorier:" - date_label : "Uppdaterades:" - comments_label : "Lämna en kommentar" - comments_title : "Kommentarer" - more_label : "Lär dig mer" - related_label : "Du kanske vill även läsa:" - follow_label : "Följ:" - feed_label : "Flöde" - powered_by : "Framställd med" - website_label : "Webbsida" - email_label : "E-post" - recent_posts : "Senaste inlägg" - undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml" - comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade." - comment_form_comment_label : "Kommentar" - comment_form_md_info : "Använd Markdown för text-formateringen." - comment_form_name_label : "Namn" - comment_form_email_label : "E-post adress" - comment_form_website_label : "Webdsida (valfritt)" - comment_btn_submit : "Skicka en kommentar" - comment_btn_submitted : "Kommentaren har tagits emot" - comment_success_msg : "Tack för din kommentar! Den kommer att visas på sidan så fort den har godkännts." - comment_error_msg : "Tyvärr det har blivit något fel i en av fälten, se till att du fyller i alla rutor och försök igen." - loading_label : "Laddar..." -sv-SE: - <<: *DEFAULT_SV -sv-FI: - <<: *DEFAULT_SV - -# Dutch -# ----------------- -nl: &DEFAULT_NL - page : "Pagina" - pagination_previous : "Vorige" - pagination_next : "Volgende" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : "Wissel Menu" - toc_label : "Op deze pagina" - ext_link_label : "Directe Link" - less_than : "minder dan" - minute_read : "minuut gelezen" - share_on_label : "Deel op" - meta_label : - tags_label : "Labels:" - categories_label : "Categorieën:" - date_label : "Bijgewerkt:" - comments_label : "Laat een reactie achter" - comments_title : "Commentaren" - more_label : "Meer informatie" - related_label : "Bekijk ook eens" - follow_label : "Volg:" - feed_label : "Feed" - powered_by : "Aangedreven door" - website_label : "Website" - email_label : "Email" - recent_posts : "Recente berichten" - undefined_wpm : "Niet gedefinieerde parameter words_per_minute bij _config.yml" - comment_form_info : "Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd" - comment_form_comment_label : "Commentaar" - comment_form_md_info : "Markdown wordt ondersteund." - comment_form_name_label : "Naam" - comment_form_email_label : "E-mailadres" - comment_form_website_label : "Website (optioneel)" - comment_btn_submit : "Commentaar toevoegen" - comment_btn_submitted : "Toegevoegd" - comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd." - comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw." - loading_label : "Laden..." -nl-BE: - <<: *DEFAULT_NL -nl-NL: - <<: *DEFAULT_NL - -# Indonesian -# ----------------- -id: &DEFAULT_ID - page : "Halaman" - pagination_previous : "Kembali" - pagination_next : "Maju" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : "Menu Toggle" - toc_label : "Pada Halaman Ini" - ext_link_label : "Link langsung" - less_than : "Kurang dari" - minute_read : "Waktu baca" - share_on_label : "Berbagi di" - meta_label : - tags_label : "Golongan:" - categories_label : "Kategori:" - date_label : "Diupdate:" - comments_label : "Tinggalkan komentar" - comments_title : "Komentar" - more_label : "Pelajari lagi" - related_label : "Anda juga akan suka" - follow_label : "Ikuti:" - feed_label : "Feed" - powered_by : "Didukung oleh" - website_label : "Website" - email_label : "Email" - recent_posts : "Posting terbaru" - undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml" - comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai" - comment_form_comment_label : "Komentar" - comment_form_md_info : "Markdown disupport." - comment_form_name_label : "Nama" - comment_form_email_label : "Alamat email" - comment_form_website_label : "Website (opsional)" - comment_btn_submit : "Submit Komentar" - comment_btn_submitted : "Telah disubmit" - comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui." - comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali." - loading_label : "Sedang meload..." -id-ID: - <<: *DEFAULT_ID - -# Vietnamese -# ----------------- -vi: &DEFAULT_VI - page : "Trang" - pagination_previous : "Trước" - pagination_next : "Sau" - breadcrumb_home_label : "Trang chủ" - breadcrumb_separator : "/" - menu_label : "Menu" - toc_label : "Tại trang này" - ext_link_label : "Đường dẫn trực tiếp" - less_than : "nhỏ hơn" - minute_read : "phút đọc" - share_on_label : "Chia sẻ tại" - meta_label : - tags_label : "Nhãn:" - categories_label : "Chủ đề:" - date_label : "Cập nhật:" - comments_label : "Để lại bình luận" - comments_title : "Bình luận" - more_label : "Mở rộng" - related_label : "Có thể bạn cũng thích" - follow_label : "Theo dõi:" - feed_label : "Feed" - powered_by : "Được hỗ trợ bởi" - website_label : "Website" - email_label : "Email" - recent_posts : "Bài viết mới" - undefined_wpm : "Chưa định nghĩa thông số words_per_minute tại _config.yml" - comment_form_info : "Email của bạn sẽ được giữ bí mật. Các phần bắt buộc được đánh dấu." - comment_form_comment_label : "Bình luận" - comment_form_md_info : "Hỗ trợ Markdown." - comment_form_name_label : "Tên" - comment_form_email_label : "Địa chỉ email" - comment_form_website_label : "Website (không bắt buộc)" - comment_btn_submit : "Gửi bình luận" - comment_btn_submitted : "Đã được gửi" - comment_success_msg : "Cảm ơn bạn đã bình luận! Bình luận sẽ xuất hiện sau khi được duyệt." - comment_error_msg : "Rất tiếc, có lỗi trong việc gửi bình luận. Hãy đảm bảo toàn bộ các phần bắt buộc đã được điền đầy đủ và thử lại." - loading_label : "Đang tải..." -vi-VN: - <<: *DEFAULT_VI - -# Danish -# ------ -da: &DEFAULT_DA - page : "Side" - pagination_previous : "Forrige" - pagination_next : "Næste" - breadcrumb_home_label : "Home" - breadcrumb_separator : "/" - menu_label : "Vis/skjul menu" - toc_label : "På denne side" - ext_link_label : "Direkte link" - less_than : "mindre end" - minute_read : "minutters læsning" - share_on_label : "Del på" - meta_label : - tags_label : "Nøgleord:" - categories_label : "Kategorier:" - date_label : "Opdateret:" - comments_label : "Skriv en kommentar" - comments_title : "Kommentarer" - more_label : "Lær mere" - related_label : "Måske kan du også lide" - follow_label : "Følg:" - feed_label : "Feed" - powered_by : "Drives af" - website_label : "Website" - email_label : "E-mail" - recent_posts : "Seneste indlæg" - undefined_wpm : "Parameteren words_per_minute er ikke defineret i _config.yml" - comment_form_info : "Din e-mail bliver ikke offentliggjort. Obligatoriske felter er markeret" - comment_form_comment_label : "Kommentar" - comment_form_md_info : "Markdown er understøttet." - comment_form_name_label : "Navn" - comment_form_email_label : "E-mail" - comment_form_website_label : "Website (frivillig)" - comment_btn_submit : "Send kommentar" - comment_btn_submitted : "Sendt" - comment_success_msg : "Tak for din kommentar! Den bliver vist på siden, så snart den er godkendt." - comment_error_msg : "Desværre skete der en fejl. Prøv igen, mens du sørger for at alle obligatoriske felter er udfyldt." - loading_label : "Indlæser..." - search_placeholder_text : "Hvad leder du efter..." - results_found : "Resultat(er) fundet" -da-DK: - <<: *DEFAULT_DA - -# Polish -# ------ -pl: &DEFAULT_PL - page : "Strona" - pagination_previous : "Poprzednia" - pagination_next : "Następna" - breadcrumb_home_label : "Strona główna" - breadcrumb_separator : "/" - menu_label : "Przełącz menu" - toc_label : "Spis treści" - ext_link_label : "Link bezpośredni" - less_than : "mniej niż" - minute_read : "minut(y)" - share_on_label : "Udostępnij" - meta_label : - tags_label : "Tagi:" - categories_label : "Kategorie:" - date_label : "Ostatnia aktualizacja:" - comments_label : "Zostaw komentarz" - comments_title : "Komentarze" - more_label : "Dowiedz się więcej" - related_label : "Także może Ci się spodobać" - follow_label : "Śledź:" - feed_label : "Feed" - powered_by : "Powstało dzięki" - website_label : "Strona" - email_label : "Email" - recent_posts : "Najnowsze wpisy" - undefined_wpm : "Parametr words_per_minute nie został zdefiniowany w _config.yml." - comment_form_info : "Twój adres email nie będzie udostępiony. Wymagane pola są oznaczone." - comment_form_comment_label : "Skomentuj" - comment_form_md_info : "Markdown jest wspierany" - comment_form_name_label : "Imię" - comment_form_email_label : "Adres email" - comment_form_website_label : "Strona www (opcjonalna)" - comment_btn_submit : "Skomentuj" - comment_btn_submitted : "Komentarz dodany" - comment_success_msg : "Dziękuję za Twój komentarz! Zostanie dodany po akceptacji." - comment_error_msg : "Niestety wystąpił błąd. Proszę upewnij się, że wszystkie wymagane pola zostały wypełnione i spróbuj ponownie." - loading_label : "Trwa ładowanie strony..." -da-PL: - <<: *DEFAULT_PL - -# Japanese -# ----------------- -ja: &DEFAULT_JA - page : "ページ" - pagination_previous : "前へ" - pagination_next : "次へ" - breadcrumb_home_label : "ホーム" - breadcrumb_separator : "/" - menu_label : "メニュー" - toc_label : "目次" - ext_link_label : "リンク" - less_than : - minute_read : - share_on_label : "共有" - meta_label : - tags_label : "タグ:" - categories_label : "カテゴリー:" - date_label : "更新日時:" - comments_label : "コメントする" - comments_title : "コメント" - more_label : "さらに詳しく" - related_label : "関連記事" - follow_label : "フォロー" - feed_label : - powered_by : - website_label : - email_label : - recent_posts : "最近の投稿" - undefined_wpm : "パラメータ words_per_minute が _config.yml で定義されていません" - comment_form_info : "メールアドレスが公開されることはありません。次の印のある項目は必ず入力してください:" - comment_form_comment_label : "コメント" - comment_form_md_info : "Markdown を使用できます" - comment_form_name_label : "名前" - comment_form_email_label : "メールアドレス" - comment_form_website_label : "URL (任意)" - comment_btn_submit : "コメントを送信する" - comment_btn_submitted : "送信しました" - comment_success_msg : "コメントありがとうございます! コメントは承認されるとページに表示されます。" - comment_error_msg : "送信エラーです。必須項目がすべて入力されていることを確認して再送信してください。" - loading_label : "読み込み中..." - search_placeholder_text : "検索キーワードを入力してください..." - results_found : "件" -ja-JP: - <<: *DEFAULT_JA - -# Another locale -# -------------- -# diff --git a/docs/_drafts/todo.txt b/docs/_drafts/todo.txt deleted file mode 100644 index f1af7efac52e5c45cd9176a3c7a48a53cdd8ac26..0000000000000000000000000000000000000000 --- a/docs/_drafts/todo.txt +++ /dev/null @@ -1,10 +0,0 @@ -TODOs: - -Development road map: - 1. Some features in admin not fully working - 2. Doc string model.py - 2. improve test coverage - 3. support of db-name, port etc in settings - convert from printf to debug. - Better code structuring. - [comment](Providing 'rollback' and 'transaction' support for Django) diff --git a/docs/_includes/advert_row b/docs/_includes/advert_row deleted file mode 100644 index ded5193b7a0abb41bc4d3c8b4e339d2d8577cc2d..0000000000000000000000000000000000000000 --- a/docs/_includes/advert_row +++ /dev/null @@ -1,27 +0,0 @@ - -<div class="feature__wrapper"> - - {% for f in page.advert_row %} - <div class="feature__item"> - <div class="archive__item"> - {% if f.image_path %} - <div class="archive__item-teaser" style="margin-bottom: 2em"> - {% if f.image_link %} - <a href="{{ f.image_link | relative_url }}"> - <img src="{{ f.image_path | relative_url }}" - alt="{% if f.alt %}{{ f.alt }}{% endif %}"> - </a> - {% else %} - <img src="{{ f.image_path | relative_url }}" - alt="{% if f.alt %}{{ f.alt }}{% endif %}"> - {% endif %} - {% if f.image_caption %} - <span class="archive__item-caption">{{ f.image_caption | markdownify | remove: "<p>" | remove: "</p>" }}</span> - {% endif %} - </div> - {% endif %} - </div> - </div> - {% endfor %} - -</div> diff --git a/docs/_includes/empty_banner b/docs/_includes/empty_banner deleted file mode 100644 index 6598064dbaaa56d79a602c0646b9f4cb1f5afd2c..0000000000000000000000000000000000000000 --- a/docs/_includes/empty_banner +++ /dev/null @@ -1 +0,0 @@ -<div class="empty-banner"></div> \ No newline at end of file diff --git a/docs/_includes/feedback.html b/docs/_includes/feedback.html deleted file mode 100644 index fb36f183e9c6ffb5c4d8528abfdf12c244384b16..0000000000000000000000000000000000000000 --- a/docs/_includes/feedback.html +++ /dev/null @@ -1,14 +0,0 @@ -<div class="toc feedback"> -<header><h4 class="nav__title"><i class="fas fa-{{ page.toc_icon | default: 'file-alt' }}"></i> Rate the Docs</h4></header> -<form action="https://formspree.io/nesdis@gmail.com" method="POST"> - <select name="rating"> - <option value="1">1 (Sucks)</option> - <option value="2">2</option> - <option value="3" selected>3</option> - <option value="4">4</option> - <option value="4">5 (Awesome)</option> - </select> - <textarea name="feedback" rows="5" cols="30">Feedback</textarea> - <input type="submit" value="Send"> -</form> -</div> \ No newline at end of file diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html deleted file mode 100644 index ac9b0671e267e3472ad5d10ebaf429156a124c3f..0000000000000000000000000000000000000000 --- a/docs/_includes/footer.html +++ /dev/null @@ -1,20 +0,0 @@ -<div class="page__footer-follow"> - <ul class="social-icons"> - {% if site.data.ui-text[site.locale].follow_label %} - <li><strong>{{ site.data.ui-text[site.locale].follow_label }}</strong></li> - {% endif %} - - {% if site.footer.links %} - {% for link in site.footer.links %} - {% if link.label and link.url %} - <li><a href="{{ link.url }}" rel="nofollow noopener noreferrer"> {{ link.label }}</a></li> - {% endif %} - {% endfor %} - {% endif %} - {% if site.data.ui-text[site.locale].feed_label %} - <li><a href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}"><i class="fas fa-fw fa-rss-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].feed_label | default: "Feed" }}</a></li> - {% endif %} - </ul> -</div> - -<div class="page__footer-copyright">© {{ site.time | date: '%Y' }} {{ site.name | default: site.title }}. {{ site.data.ui-text[site.locale].powered_by | default: "Powered by" }} <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div> diff --git a/docs/_includes/head/custom.html b/docs/_includes/head/custom.html deleted file mode 100644 index 54a9551ee9afd2d981f0f99bc058ae412d48b085..0000000000000000000000000000000000000000 --- a/docs/_includes/head/custom.html +++ /dev/null @@ -1,5 +0,0 @@ -<!-- start custom head snippets --> -<link rel="stylesheet" type="text/css" media="screen" href="{{'/assets/css/custom.css' | relative_url}}"> - -{% include vendors/google-tag-manager.html %} -<!-- end custom head snippets --> \ No newline at end of file diff --git a/docs/_includes/links b/docs/_includes/links deleted file mode 100644 index bca0fbb0d9ac1c0a9ab20f44febf96f061ed07a4..0000000000000000000000000000000000000000 --- a/docs/_includes/links +++ /dev/null @@ -1,2 +0,0 @@ -[sponsor_page]: https://nesdis.github.io/djaosdb/sponsor/ - diff --git a/docs/_includes/pizza.html b/docs/_includes/pizza.html deleted file mode 100644 index 9bf8206302e993b63e6098cc24b90522d62b3e03..0000000000000000000000000000000000000000 --- a/docs/_includes/pizza.html +++ /dev/null @@ -1,6 +0,0 @@ -{% if page.pizza %} - <aside class="sidebar__right" style="position: sticky; top: 2em; float: right"> - <header><h4 class="nav__title"><i class="fas fa-{{ page.toc_icon | default: 'file-alt' }}"></i> Buy ME A Pizza</h4></header> - <a href="https://www.patreon.com/posts/buy-me-pizza-26095081"><img src="/djaosdb/assets/images/pizza.jpg"></a> - </aside> -{% endif %} \ No newline at end of file diff --git a/docs/_includes/tire_column b/docs/_includes/tire_column deleted file mode 100644 index 2ea52288097b4d7d35e29c9b4ecfe069d1810e00..0000000000000000000000000000000000000000 --- a/docs/_includes/tire_column +++ /dev/null @@ -1,27 +0,0 @@ - - <div class="tire__container"> - {% for s in page.tires %} - {% unless s.invisible %} - <div class="tire_item__box"> - <div class="tire_item__title">{{ s.title }}</div> - <div class="tire_item__price">${{ s.price }}</div> - <div class="tire_item__period">PER MONTH</div> - <button id="{{ s.btn_id }}" class="btn btn--success btn--large">Join</button> - <div class="tire_item__benefit"> - <ul> - {% for b in s.benefits %} - <li>{{ b | markdownify | remove: "<p>" | remove: "</p>" }}</li> - {% endfor %} - </ul> - </div> - </div> - {% endunless %} - {% endfor %} - </div> - <div class="tire__disclaimer"> - <ul class="notice--warning"> - {% for d in page.disclaimer %} - <li><em>{{ d }}</em></li> - {% endfor %} - </ul> - </div> diff --git a/docs/_includes/vendors/google-tag-manager.html b/docs/_includes/vendors/google-tag-manager.html deleted file mode 100644 index 2caea24e12ad83a13116d351f74e73ee1e9d32b6..0000000000000000000000000000000000000000 --- a/docs/_includes/vendors/google-tag-manager.html +++ /dev/null @@ -1,7 +0,0 @@ -<!-- Google Tag Manager --> -<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': -new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], -j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= -'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); -})(window,document,'script','dataLayer','GTM-T72KG6N');</script> -<!-- End Google Tag Manager --> diff --git a/docs/_includes/vendors/hotjar.html b/docs/_includes/vendors/hotjar.html deleted file mode 100644 index 3bc3fd95634410f0e1406f4e0367d7a997642db5..0000000000000000000000000000000000000000 --- a/docs/_includes/vendors/hotjar.html +++ /dev/null @@ -1,10 +0,0 @@ -<script> - (function(h,o,t,j,a,r){ - h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; - h._hjSettings={hjid:817955,hjsv:6}; - a=o.getElementsByTagName('head')[0]; - r=o.createElement('script');r.async=1; - r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; - a.appendChild(r); - })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); -</script> \ No newline at end of file diff --git a/docs/_includes/vendors/stripe.html b/docs/_includes/vendors/stripe.html deleted file mode 100644 index c5b9fc349942575c0f413379175a974aefd5d372..0000000000000000000000000000000000000000 --- a/docs/_includes/vendors/stripe.html +++ /dev/null @@ -1,37 +0,0 @@ -<script> - // Replace with your own publishable key: https://dashboard.stripe.com/test/apikeys - var PUBLISHABLE_KEY = "pk_live_eEfW8XjO4oZUPRFaYASLCWqn"; - // Replace with the domain you want your users to be redirected back to after payment - var DOMAIN = "https://nesdis.github.io"; - - var stripe = Stripe(PUBLISHABLE_KEY); - - // Handle any errors from Checkout - var handleResult = function (result) { - if (result.error) { - var displayError = document.getElementById("error-message"); - displayError.textContent = result.error.message; - } - }; - - var redirectToCheckout = function (priceId) { - // Make the call to Stripe.js to redirect to the checkout page - // with the current quantity - stripe - .redirectToCheckout({ - lineItems: [{ price: priceId, quantity: 1 }], - successUrl: - DOMAIN + "/djaosdb?session_id={CHECKOUT_SESSION_ID}", - cancelUrl: DOMAIN + "/sponsor", - mode: 'subscription', - }) - .then(handleResult); - }; -{% for t in page.tires %} - document - .getElementById("{{ t.btn_id }}") - .addEventListener("click", function (evt) { - redirectToCheckout("{{ t.price_id }}"); - }); -{% endfor %} -</script> \ No newline at end of file diff --git a/docs/_sass/_custom-components.scss b/docs/_sass/_custom-components.scss deleted file mode 100644 index 6b2a55e8b875afe3cc4cb9ad171795889f9e9f72..0000000000000000000000000000000000000000 --- a/docs/_sass/_custom-components.scss +++ /dev/null @@ -1,3 +0,0 @@ -.empty-banner { - height: 100px; -} diff --git a/docs/_sass/sponsor-tire/_components.scss b/docs/_sass/sponsor-tire/_components.scss deleted file mode 100644 index 95e38737d50dfec9f4b1db5ad153a73d03c9d44b..0000000000000000000000000000000000000000 --- a/docs/_sass/sponsor-tire/_components.scss +++ /dev/null @@ -1,16 +0,0 @@ -@import "variables"; - -.tire__container { - display: flex; - justify-content: left; - flex-direction: row; - flex-wrap: wrap; -} - -.tire__disclaimer { - margin-left: $box-side-margin; - display: inline-block; - .notice--warning li { - margin-left: $box-side-margin; - } -} diff --git a/docs/_sass/sponsor-tire/_item.scss b/docs/_sass/sponsor-tire/_item.scss deleted file mode 100644 index 03b1618d66b8e2a17da3a0a7f8d2636254a110ed..0000000000000000000000000000000000000000 --- a/docs/_sass/sponsor-tire/_item.scss +++ /dev/null @@ -1,67 +0,0 @@ -@import "variables"; - -%box-border { - border-style: solid; - border-width: 1px; - border-color: rgb(229, 227, 221); - border-radius: 4px; -} - -%box-spacing { - margin-bottom: 2em; - margin-left: $box-side-margin; - margin-right: $box-side-margin; - - padding: 1em; -} - -%box-size { - min-width: $min-box-width; - width: calc(33% - #{$box-side-margin}*2); -} - -.tire_item__box { - @extend %box-border; - @extend %box-spacing; - @extend %box-size; - - text-align: center; - - ul { - text-align: left; - } -} - -.tire_item__title { - font-weight: bold; - margin-bottom: 1.5em; -} - -.tire_item__price { - font-weight: bold; - font-size: 2.5em; -} - -.tire_item__period { - font-size: 0.9em; - font-weight: lighter; - margin-bottom: 1em; -} - - -@media (max-width: $min-box-width-px*3 + $box-side-margin-px*6 + 2*$base-font-size-px) { - %box-size { - width: calc(50% - #{$box-side-margin}*2); - } -} - -@media (max-width: 650px) { - .tire__wrapper { - display: block; - } - .tire_item__box { - width: 100%; - margin-left: 0; - margin-right: 0; - } -} diff --git a/docs/_sass/sponsor-tire/_sponsor-tire.scss b/docs/_sass/sponsor-tire/_sponsor-tire.scss deleted file mode 100644 index f8ca156a22b732245e74704536bb5d56eccd30f7..0000000000000000000000000000000000000000 --- a/docs/_sass/sponsor-tire/_sponsor-tire.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import "components"; -@import "item"; \ No newline at end of file diff --git a/docs/_sass/sponsor-tire/_variables.scss b/docs/_sass/sponsor-tire/_variables.scss deleted file mode 100644 index 0147fb74cdd01d17672f0481605e1913266bde0d..0000000000000000000000000000000000000000 --- a/docs/_sass/sponsor-tire/_variables.scss +++ /dev/null @@ -1,6 +0,0 @@ -$min-box-width: 16em; -$box-side-margin: 1em; - -$base-font-size-px: 20px; -$min-box-width-px: 16 * $base-font-size-px; -$box-side-margin-px: 1 * $base-font-size-px; diff --git a/docs/_sass/style.scss b/docs/_sass/style.scss deleted file mode 100644 index f77c13ce90a390a4de75b5bdb1158da59b2272c4..0000000000000000000000000000000000000000 --- a/docs/_sass/style.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import "sponsor-tire/sponsor-tire"; -@import "custom-components"; \ No newline at end of file diff --git a/docs/assets/css/custom.scss b/docs/assets/css/custom.scss deleted file mode 100644 index 81f728e8f5173859ca95a477378b3fc7e80a4a68..0000000000000000000000000000000000000000 --- a/docs/assets/css/custom.scss +++ /dev/null @@ -1,5 +0,0 @@ ---- -# this ensures Jekyll reads the file to be transformed into CSS later ---- - -@import "style"; \ No newline at end of file diff --git a/docs/assets/images/admin-extended.jpg b/docs/assets/images/admin-extended.jpg deleted file mode 100644 index 7932837cf1c435ff4a67a25e7055609e79b10fe8..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/admin-extended.jpg and /dev/null differ diff --git a/docs/assets/images/admin.png b/docs/assets/images/admin.png deleted file mode 100644 index 2a0f3d331d4c73f6a426a766f91ac62fb7e987c9..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/admin.png and /dev/null differ diff --git a/docs/assets/images/admin2.jpg b/docs/assets/images/admin2.jpg deleted file mode 100644 index bff6f3a981d414d6146252f84a38fc829053e2aa..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/admin2.jpg and /dev/null differ diff --git a/docs/assets/images/array-model-field.jpg b/docs/assets/images/array-model-field.jpg deleted file mode 100644 index b9389304e1409ac006482c3bd0854a2a3820c8e6..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/array-model-field.jpg and /dev/null differ diff --git a/docs/assets/images/array-model-field.png b/docs/assets/images/array-model-field.png deleted file mode 100644 index f02dc155868a508fc75101da21bb150a114946ba..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/array-model-field.png and /dev/null differ diff --git a/docs/assets/images/arrow.png b/docs/assets/images/arrow.png deleted file mode 100644 index 3c057b57b8a3971d8f244333920a37b0343a352c..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/arrow.png and /dev/null differ diff --git a/docs/assets/images/arrows.psd b/docs/assets/images/arrows.psd deleted file mode 100644 index e6e9ea493a34dd2664edaadbe52093bc115d966d..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/arrows.psd and /dev/null differ diff --git a/docs/assets/images/banner.png b/docs/assets/images/banner.png deleted file mode 100644 index 4cdc020621b73142f9ea249b7c210213519c85cb..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/banner.png and /dev/null differ diff --git a/docs/assets/images/banner.svg b/docs/assets/images/banner.svg deleted file mode 100644 index b5b3a6a5903561c4baf62bafbc6079f5cfbae87d..0000000000000000000000000000000000000000 --- a/docs/assets/images/banner.svg +++ /dev/null @@ -1,692 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="2000" - height="551.21973" - viewBox="0 0 2000 551.21973" - id="svg4190" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="banner.svg" - inkscape:export-filename="C:\Users\27989\twsent\djaosdb\bitbucket\djaosdb\docs\images\banner.png" - inkscape:export-xdpi="190.05125" - inkscape:export-ydpi="190.05125"> - <defs - id="defs4192" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.70710678" - inkscape:cx="1012.9943" - inkscape:cy="229.45331" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-right="100" - units="px" - fit-margin-left="100" - fit-margin-top="20" - fit-margin-bottom="20" - inkscape:window-width="1920" - inkscape:window-height="996" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" - showguides="false" - inkscape:guide-bbox="true"> - <sodipodi:guide - position="311.12698,19.79899" - orientation="0,1" - id="guide4440" /> - <sodipodi:guide - position="425.67828,531.7443" - orientation="0,1" - id="guide4442" /> - </sodipodi:namedview> - <metadata - id="metadata4195"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(25.352128,-283.05595)"> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#158570;fill-opacity:0.94117647;fill-rule:evenodd;stroke:#000000;stroke-width:3.31182981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4246" - width="1996.6881" - height="547.9079" - x="-23.696182" - y="284.71185" /> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136" - width="227.31413" - height="69.048096" - x="129.27444" - y="304.7301" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="176.32455" - y="335.62161" - id="text4400" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="176.32455" - y="335.62161" - id="tspan4402"><tspan - x="176.32455" - y="335.62161" - style="font-size:25.11229134px" - id="tspan4404">Django App</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-6" - width="137.81071" - height="69.797821" - x="219.13048" - y="392.11987" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="251.03961" - y="423.49268" - id="text4430" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="251.03961" - y="423.49268" - id="tspan4432"><tspan - x="251.03961" - y="423.49268" - style="font-size:25.11229134px" - id="tspan4434">Contrib</tspan></tspan></text> - <rect - ry="12.946519" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2" - width="227.31413" - height="69.048096" - x="129.27444" - y="480.2594" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="206.29869" - y="508.61099" - id="text4424" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="206.29869" - y="508.61099" - id="tspan4426"><tspan - x="206.29869" - y="508.61099" - style="font-size:25.11229134px" - id="tspan4428">Models</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5" - width="227.31413" - height="69.048096" - x="129.27444" - y="568.02411" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="212.04335" - y="591.17273" - id="text4418" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="212.04335" - y="591.17273" - id="tspan4420"><tspan - x="212.04335" - y="591.17273" - style="font-size:25.11229134px" - id="tspan4422">Query</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1" - width="227.31413" - height="69.048096" - x="129.27444" - y="655.7887" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="164.46735" - y="678.43683" - id="text4412" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="164.46735" - y="678.43683" - id="tspan4414"><tspan - x="164.46735" - y="678.43683" - style="font-size:25.11229134px" - id="tspan4416">DB connector</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0" - width="227.31413" - height="69.048096" - x="129.27444" - y="743.55341" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="189.93523" - y="763.55518" - id="text4406" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="189.93523" - y="763.55518" - id="tspan4408"><tspan - x="189.93523" - y="763.55518" - style="font-size:25.11229134px" - id="tspan4410">DataBase</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f22222;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-9" - width="227.31413" - height="69.048096" - x="599.67548" - y="392.76636" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="661.35065" - y="421.00342" - id="text4400-4" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="661.35065" - y="421.00342" - id="tspan4402-6"><tspan - x="661.35065" - y="421.00342" - style="font-size:25.11229134px" - id="tspan4404-3">Django App</tspan></tspan></text> - <g - transform="matrix(0.81183621,0,0,0.86310123,-75.2589,233.49993)" - id="g4226"> - <rect - y="285.56921" - x="942.05017" - height="80.868637" - width="169.75186" - id="rect4136-6-2" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f22222;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - rx="15" /> - <text - sodipodi:linespacing="125%" - id="text4430-2" - y="337.17297" - x="972.03107" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4432-8" - y="337.17297" - x="972.03107" - sodipodi:role="line"><tspan - id="tspan4434-2" - style="font-size:30px" - y="337.17297" - x="972.03107">Contrib</tspan></tspan></text> - </g> - <rect - ry="12.946519" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#148570;fill-opacity:0.94117647;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-7" - width="227.31413" - height="69.048096" - x="599.67548" - y="567.93347" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="691.32458" - y="593.64142" - id="text4424-1" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="691.32458" - y="593.64142" - id="tspan4426-4"><tspan - x="691.32458" - y="593.64142" - style="font-size:25.11229134px" - id="tspan4428-7">ODM</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0-2" - width="227.31413" - height="69.048096" - x="599.67548" - y="655.51703" - ry="12.946519" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="674.96112" - y="678.1734" - id="text4406-5" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="674.96112" - y="678.1734" - id="tspan4408-4"><tspan - x="674.96112" - y="678.1734" - style="font-size:25.11229134px" - id="tspan4410-9">MongoDB</tspan></tspan></text> - <path - inkscape:connector-curvature="0" - id="path4224" - d="m 571.04892,558.66573 284.56726,0" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f22222;stroke-width:0.83707637;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.69661086, 3.34830543;stroke-dashoffset:0;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4224-2" - d="m 571.04892,646.24928 284.56726,0" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.83707625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.69661006, 3.34830503;stroke-dashoffset:0;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4163" - d="m 385.21515,470.90112 c 0,0 0,0 -40.90941,-5e-5 l 0,0 -203.49266,0 -40.16521,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.87025905;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.96207241, 3.48103621;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4" - d="m 385.21515,734.19508 -36.76535,0 0,0 -208.04628,0 -39.75565,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.83707625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.69661006, 3.34830503;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <g - id="g4619" - transform="matrix(0.81183621,0,0,0.86310123,-75.10294,246.18753)"> - <path - inkscape:connector-curvature="0" - id="path4600" - d="m 601.3677,357.35991 141.42857,0 -25.63736,-14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4600-5" - d="m 601.46614,366.72254 141.42857,0 -25.63736,14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - <g - id="g4619-8" - transform="matrix(0.82222068,0,0,0.82222068,896.74466,260.98806)"> - <path - inkscape:connector-curvature="0" - id="path4600-2" - d="m 601.3677,357.35991 141.42857,0 -25.63736,-14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4600-5-9" - d="m 601.46614,366.72254 141.42857,0 -25.63736,14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#148570;fill-opacity:0.94117647;fill-rule:evenodd;stroke:#000000;stroke-width:3.28888273;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-4" - width="230.22179" - height="65.777657" - x="1587.4332" - y="655.8479" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.44441414px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1598.8973" - y="695.34308" - id="text4412-9" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="1598.8973" - y="695.34308" - id="tspan4414-4"><tspan - x="1598.8973" - y="695.34308" - style="font-size:24.66662025px" - id="tspan4416-0">SQL to caosdb</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.28888273;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0-2-5" - width="230.22179" - height="65.777657" - x="1587.4332" - y="743.61261" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.44441414px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1642.9792" - y="782.92108" - id="text4406-4" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="1642.9792" - y="782.92108" - id="tspan4408-1"><tspan - x="1642.9792" - y="782.92108" - style="font-size:24.66662025px" - id="tspan4410-4">MongoDB</tspan></tspan></text> - <path - inkscape:connector-curvature="0" - id="path4163-4-6" - d="m 1846.6479,642.27353 -37.2357,0 0,0 -210.7074,0 -40.2642,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.82222062;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.5777647, 3.28888234;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4-68" - d="m 1846.6479,731.88124 -37.2357,0 0,0 -210.7074,0 -40.2642,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.82222062;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.5777647, 3.28888234;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:38.16191864px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="942.74268" - y="572.53857" - id="text5135" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - id="tspan5137" - x="942.74268" - y="572.53857" - style="font-weight:bold">VS</tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-4" - width="227.31413" - height="69.048096" - x="1095.5992" - y="303.15411" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1172.6926" - y="334.09317" - id="text4400-8" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1172.6926" - y="334.09317" - id="tspan4402-9"><tspan - x="1172.6926" - y="334.09317" - style="font-size:25.11229134px" - id="tspan4404-39">Django App</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-6-4" - width="137.81071" - height="69.797821" - x="1185.4553" - y="390.54385" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1247.4077" - y="421.9642" - id="text4430-0" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1247.4077" - y="421.9642" - id="tspan4432-1"><tspan - x="1247.4077" - y="421.9642" - style="font-size:25.11229134px" - id="tspan4434-4">Contrib</tspan></tspan></text> - <rect - ry="12.946519" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-6" - width="227.31413" - height="69.048096" - x="1095.5992" - y="478.68341" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1202.6667" - y="507.08252" - id="text4424-11" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1202.6667" - y="507.08252" - id="tspan4426-0"><tspan - x="1202.6667" - y="507.08252" - style="font-size:25.11229134px" - id="tspan4428-9">Models</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5-2" - width="227.31413" - height="69.048096" - x="1095.5992" - y="566.44812" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1208.4114" - y="589.64429" - id="text4418-7" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1208.4114" - y="589.64429" - id="tspan4420-6"><tspan - x="1208.4114" - y="589.64429" - style="font-size:25.11229134px" - id="tspan4422-2">Query</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-2" - width="227.31413" - height="69.048096" - x="1095.5992" - y="654.21271" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1160.8354" - y="676.90839" - id="text4412-3" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1160.8354" - y="676.90839" - id="tspan4414-1"><tspan - x="1160.8354" - y="676.90839" - style="font-size:25.11229134px" - id="tspan4416-3">DB connector</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0-7" - width="227.31413" - height="69.048096" - x="1095.5992" - y="741.97742" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1186.3033" - y="762.02673" - id="text4406-7" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1186.3033" - y="762.02673" - id="tspan4408-0"><tspan - x="1186.3033" - y="762.02673" - style="font-size:25.11229134px" - id="tspan4410-7">DataBase</tspan></tspan></text> - <path - inkscape:connector-curvature="0" - id="path4163-7" - d="m 1351.54,643.2734 c 0,0 0,0 -40.9094,-5e-5 l 0,0 -203.4927,0 -40.1652,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.87025905;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.96207241, 3.48103621;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4-1" - d="m 1351.54,732.61909 -36.7654,0 0,0 -208.0462,0 -39.7557,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.83707625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.69661006, 3.34830503;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-4-6" - width="227.31413" - height="69.048096" - x="1589.9585" - y="301.8233" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1682.4215" - y="332.80252" - id="text4400-8-5" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1682.4215" - y="332.80252" - id="tspan4402-9-9"><tspan - x="1682.4215" - y="332.80252" - style="font-size:25.11229134px" - id="tspan4404-39-5">Django App</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-6-4-4" - width="137.81071" - height="69.797821" - x="1679.8146" - y="389.21304" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1757.1366" - y="420.67355" - id="text4430-0-9" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1757.1366" - y="420.67355" - id="tspan4432-1-7"><tspan - x="1757.1366" - y="420.67355" - style="font-size:25.11229134px" - id="tspan4434-4-9">Contrib</tspan></tspan></text> - <rect - ry="12.946519" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-6-5" - width="227.31413" - height="69.048096" - x="1589.9585" - y="477.35263" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152756px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1712.3956" - y="505.79184" - id="text4424-11-7" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1712.3956" - y="505.79184" - id="tspan4426-0-1"><tspan - x="1712.3956" - y="505.79184" - style="font-size:25.11229134px" - id="tspan4428-9-8">Models</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.34830546;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5-2-1" - width="227.31413" - height="69.048096" - x="1589.9585" - y="565.11737" - ry="15" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:16.74152565px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1718.1403" - y="588.35358" - id="text4418-7-8" - sodipodi:linespacing="125%" - transform="scale(0.96984726,1.0310902)"><tspan - sodipodi:role="line" - x="1718.1403" - y="588.35358" - id="tspan4420-6-5"><tspan - x="1718.1403" - y="588.35358" - style="font-size:25.11229134px" - id="tspan4422-2-7">Query</tspan></tspan></text> - </g> -</svg> diff --git a/docs/assets/images/bug.jpg b/docs/assets/images/bug.jpg deleted file mode 100644 index e5aaa8dc4b1632e373adce35726975214ea8ca20..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/bug.jpg and /dev/null differ diff --git a/docs/assets/images/django.jpg b/docs/assets/images/django.jpg deleted file mode 100755 index 13a778c40a5cab2a0d5b8a11843a5ecad00d277c..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/django.jpg and /dev/null differ diff --git a/docs/assets/images/djongo-Nxt-v1.png b/docs/assets/images/djongo-Nxt-v1.png deleted file mode 100644 index 445a5d796efd21de75f7a2e08a543310221c36ca..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-Nxt-v1.png and /dev/null differ diff --git a/docs/assets/images/djongo-logo.png b/docs/assets/images/djongo-logo.png deleted file mode 100755 index d3fa1c4cd1f82f6491786408fd9a991bb29c5ba1..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-logo.png and /dev/null differ diff --git a/docs/assets/images/djongo-symbol.ico b/docs/assets/images/djongo-symbol.ico deleted file mode 100644 index 858a74b7c1f0607e129289331152decacde831c5..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-symbol.ico and /dev/null differ diff --git a/docs/assets/images/djongo-symbol.jpg b/docs/assets/images/djongo-symbol.jpg deleted file mode 100644 index 0ac88f9b1d89a185ee45fcea69c271b13a41705e..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-symbol.jpg and /dev/null differ diff --git a/docs/assets/images/djongo-symbol.png b/docs/assets/images/djongo-symbol.png deleted file mode 100644 index c7b63a36c7b179b19922899b1a6ac4e1fe23bd1c..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-symbol.png and /dev/null differ diff --git a/docs/assets/images/djongo-symbol2.jpg b/docs/assets/images/djongo-symbol2.jpg deleted file mode 100644 index 37e1a2434c8a05724219842762142abde693247c..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/djongo-symbol2.jpg and /dev/null differ diff --git a/docs/assets/images/drf.jpg b/docs/assets/images/drf.jpg deleted file mode 100644 index f6aab6ed5203a035dd44004df9358e20113936ad..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/drf.jpg and /dev/null differ diff --git a/docs/assets/images/e2e.png b/docs/assets/images/e2e.png deleted file mode 100644 index c6fcf0519e22ca1b9a323d2e0a902fbba90ba51e..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/e2e.png and /dev/null differ diff --git a/docs/assets/images/embedded-addentry.png b/docs/assets/images/embedded-addentry.png deleted file mode 100644 index 7d4ae035276a3ba06e4b2ab5a8d0533032973313..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/embedded-addentry.png and /dev/null differ diff --git a/docs/assets/images/embedded-admin.png b/docs/assets/images/embedded-admin.png deleted file mode 100644 index a75b56a69961154cbc23d0498df800f3f188b6ce..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/embedded-admin.png and /dev/null differ diff --git a/docs/assets/images/embedded-nested.png b/docs/assets/images/embedded-nested.png deleted file mode 100644 index 1e2963252d1c0302b1e27bf9d9be2780c6becaab..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/embedded-nested.png and /dev/null differ diff --git a/docs/assets/images/feature-admin-mongo.jpg b/docs/assets/images/feature-admin-mongo.jpg deleted file mode 100644 index a484af40fb5e5b2a910e1ed7ae17f75c9ef6f7fa..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/feature-admin-mongo.jpg and /dev/null differ diff --git a/docs/assets/images/heart.png b/docs/assets/images/heart.png deleted file mode 100644 index 47a866c94abdb1fe4a0595f23e31805a2ff998a2..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/heart.png and /dev/null differ diff --git a/docs/assets/images/help.png b/docs/assets/images/help.png deleted file mode 100644 index ee5951123aecab6133320ab22847f499f0ed37a7..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/help.png and /dev/null differ diff --git a/docs/assets/images/landing-banner.jpg b/docs/assets/images/landing-banner.jpg deleted file mode 100644 index bebf519fe017b282dc2990047a4ff66165b93796..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/landing-banner.jpg and /dev/null differ diff --git a/docs/assets/images/landing-banner2.jpg b/docs/assets/images/landing-banner2.jpg deleted file mode 100644 index be8a7a26c5c0161f079dc021f1470a7e4dc3d98f..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/landing-banner2.jpg and /dev/null differ diff --git a/docs/assets/images/landing-banner3.jpg b/docs/assets/images/landing-banner3.jpg deleted file mode 100644 index 0f6bc82e1b70fcb93c26aa4bf8c681e5325f0ba5..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/landing-banner3.jpg and /dev/null differ diff --git a/docs/assets/images/layers.png b/docs/assets/images/layers.png deleted file mode 100644 index 3db2e131c652a73369eff27f9df5c8a67cce71dc..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/layers.png and /dev/null differ diff --git a/docs/assets/images/layers.svg b/docs/assets/images/layers.svg deleted file mode 100644 index 22fc2b3b6c17695d74e605afcc537ec9be36f2c3..0000000000000000000000000000000000000000 --- a/docs/assets/images/layers.svg +++ /dev/null @@ -1,233 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="251.89513" - height="420" - viewBox="0 0 251.89511 420.00001" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="layers.svg" - inkscape:export-filename="C:\Users\27989\twsent\djaosdb\bitbucket\djaosdb\docs\images\layers.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="49.473043" - inkscape:cy="273.12485" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-top="10" - fit-margin-left="10" - fit-margin-right="10" - fit-margin-bottom="10" - units="px" - inkscape:window-width="1582" - inkscape:window-height="798" - inkscape:window-x="1" - inkscape:window-y="1" - inkscape:window-maximized="1" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-210.21326,-328.78845)"> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.70075846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136" - width="189.05309" - height="54.015167" - x="241.63426" - y="340.13882" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:13.50379181px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="276.34323" - y="372.4675" - id="text4400" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="276.34323" - y="372.4675" - id="tspan4402"><tspan - x="276.34323" - y="372.4675" - style="font-size:20.25568771px" - id="tspan4404">Django App</tspan></tspan></text> - <flowRoot - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - id="flowRoot4341" - xml:space="preserve"><flowRegion - id="flowRegion4343"><rect - y="147.26552" - x="222.23357" - height="127.27922" - width="410.12195" - id="rect4345" /></flowRegion><flowPara - id="flowPara4347" /></flowRoot> <g - id="g4180" - transform="matrix(0.67518959,0,0,0.67518959,71.527552,239.96618)"> - <rect - y="249.61319" - x="362.62164" - height="80.868637" - width="169.75186" - id="rect4136-6" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4430" - y="301.21695" - x="392.60257" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4432" - y="301.21695" - x="392.60257" - sodipodi:role="line"><tspan - id="tspan4434" - style="font-size:30px" - y="301.21695" - x="392.60257">Contrib</tspan></tspan></text> - </g> - <g - id="g4186" - transform="matrix(0.67518959,0,0,0.67518959,71.527552,239.96618)"> - <rect - y="351.73276" - x="251.93918" - height="80" - width="280" - id="rect4136-2" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4424" - y="402.90219" - x="339.15353" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4426" - y="402.90219" - x="339.15353" - sodipodi:role="line"><tspan - id="tspan4428" - style="font-size:30px" - y="402.90219" - x="339.15353">Models</tspan></tspan></text> - </g> - <g - id="g4192" - transform="matrix(0.67518959,0,0,0.67518959,71.527552,239.96618)"> - <rect - y="453.418" - x="251.93918" - height="80" - width="280" - id="rect4136-2-5" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4418" - y="501.53323" - x="346.01633" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4420" - y="501.53323" - x="346.01633" - sodipodi:role="line"><tspan - id="tspan4422" - style="font-size:30px" - y="501.53323" - x="346.01633">Query</tspan></tspan></text> - </g> - <g - id="g4198" - transform="matrix(0.67518959,0,0,0.67518959,71.527552,239.96618)"> - <rect - y="555.10321" - x="251.93918" - height="80" - width="280" - id="rect4136-2-1" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4412" - y="605.78192" - x="289.18039" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4414" - y="605.78192" - x="289.18039" - sodipodi:role="line"><tspan - id="tspan4416" - style="font-size:30px" - y="605.78192" - x="289.18039">DB connector</tspan></tspan></text> - </g> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.70075846;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0" - width="189.05309" - height="54.015167" - x="241.63426" - y="683.42291" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:13.50379181px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="287.32166" - y="717.64069" - id="text4406" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="287.32166" - y="717.64069" - id="tspan4408"><tspan - x="287.32166" - y="717.64069" - style="font-size:20.25568771px" - id="tspan4410">DataBase</tspan></tspan></text> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.35;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:10.8,5.4;stroke-dashoffset:0;stroke-opacity:1" - d="m 220.21324,470.13165 231.89512,0 0,0" - id="path4163" - inkscape:connector-curvature="0" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.35037923;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:10.80303348, 5.40151674;stroke-dashoffset:0;stroke-opacity:1" - d="m 220.21324,607.44528 231.89512,0 0,0" - id="path4163-8" - inkscape:connector-curvature="0" /> - </g> -</svg> diff --git a/docs/assets/images/loading.gif b/docs/assets/images/loading.gif deleted file mode 100644 index aa16f434508d6626cc6d6a2c9b613765c85909d7..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/loading.gif and /dev/null differ diff --git a/docs/assets/images/menu.png b/docs/assets/images/menu.png deleted file mode 100644 index 62cb69625287934f126e6600c352cc1358de29a0..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/menu.png and /dev/null differ diff --git a/docs/assets/images/migration.png b/docs/assets/images/migration.png deleted file mode 100644 index 40f21c99bbf832fd2ac3e5033b9661df40a2a29d..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/migration.png and /dev/null differ diff --git a/docs/assets/images/mongo.jpg b/docs/assets/images/mongo.jpg deleted file mode 100755 index db7fae66594e975847e52811570a7902894ebe55..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/mongo.jpg and /dev/null differ diff --git a/docs/assets/images/optimization.png b/docs/assets/images/optimization.png deleted file mode 100644 index 0581afffc1bce77cf1c69da3eb698d8b19e729e9..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/optimization.png and /dev/null differ diff --git a/docs/assets/images/optimization2.png b/docs/assets/images/optimization2.png deleted file mode 100644 index 377ec6df837a086b73d51b06eead509305240e05..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/optimization2.png and /dev/null differ diff --git a/docs/assets/images/optimize.jpg b/docs/assets/images/optimize.jpg deleted file mode 100644 index cad1dc13f8019d8181fec34df96e15bdaed4b11d..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/optimize.jpg and /dev/null differ diff --git a/docs/assets/images/orm2odm.png b/docs/assets/images/orm2odm.png deleted file mode 100644 index 988a148c016a82e2eeb3628d3d2f7b3b010b8552..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/orm2odm.png and /dev/null differ diff --git a/docs/assets/images/orm2odm.svg b/docs/assets/images/orm2odm.svg deleted file mode 100644 index d4797aa0e14964d9a7a41a219f31da4890fda629..0000000000000000000000000000000000000000 --- a/docs/assets/images/orm2odm.svg +++ /dev/null @@ -1,349 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="282.45303mm" - height="187.19586mm" - viewBox="0 0 1000.8177 663.29242" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="orm2odm.svg" - inkscape:export-filename="C:\Users\27989\twsent\djaosdb\bitbucket\djaosdb\docs\images\orm2odm.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.98994949" - inkscape:cx="458.61013" - inkscape:cy="318.98919" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-top="10" - fit-margin-left="10" - fit-margin-right="10" - fit-margin-bottom="10" - units="mm" - inkscape:window-width="1920" - inkscape:window-height="996" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-181.24463,-45.095078)"> - <flowRoot - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - id="flowRoot4341" - xml:space="preserve"><flowRegion - id="flowRegion4343"><rect - y="147.26552" - x="222.23357" - height="127.27922" - width="410.12195" - id="rect4345" /></flowRegion><flowPara - id="flowPara4347" /></flowRoot> <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136" - width="280" - height="80" - x="251.93918" - y="82.528145" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="303.34543" - y="130.40901" - id="text4400" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="303.34543" - y="130.40901" - id="tspan4402"><tspan - x="303.34543" - y="130.40901" - style="font-size:30px" - id="tspan4404">Django App</tspan></tspan></text> - <g - id="g4313"> - <rect - y="183.77907" - x="362.62164" - height="80.868637" - width="169.75186" - id="rect4136-6" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4430" - y="235.38283" - x="392.60257" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4432" - y="235.38283" - x="392.60257" - sodipodi:role="line"><tspan - id="tspan4434" - style="font-size:30px" - y="235.38283" - x="392.60257">Contrib</tspan></tspan></text> - </g> - <g - id="g4319"> - <rect - y="285.89865" - x="251.93918" - height="80" - width="280" - id="rect4136-2" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4424" - y="337.06808" - x="339.15353" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4426" - y="337.06808" - x="339.15353" - sodipodi:role="line"><tspan - id="tspan4428" - style="font-size:30px" - y="337.06808" - x="339.15353">Models</tspan></tspan></text> - </g> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5" - width="280" - height="80" - x="251.93918" - y="387.58389" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="346.01633" - y="435.69913" - id="text4418" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="346.01633" - y="435.69913" - id="tspan4420"><tspan - x="346.01633" - y="435.69913" - style="font-size:30px" - id="tspan4422">Query</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1" - width="280" - height="80" - x="251.93918" - y="489.2691" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="289.18039" - y="539.94781" - id="text4412" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="289.18039" - y="539.94781" - id="tspan4414"><tspan - x="289.18039" - y="539.94781" - style="font-size:30px" - id="tspan4416">DB connector</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0" - width="280" - height="80" - x="251.93918" - y="590.95435" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="319.60519" - y="641.63312" - id="text4406" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="319.60519" - y="641.63312" - id="tspan4408"><tspan - x="319.60519" - y="641.63312" - style="font-size:30px" - id="tspan4410">DataBase</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f22222;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-9" - width="280" - height="80" - x="831.36768" - y="184.52815" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="882.77393" - y="232.40903" - id="text4400-4" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="882.77393" - y="232.40903" - id="tspan4402-6"><tspan - x="882.77393" - y="232.40903" - style="font-size:30px" - id="tspan4404-3">Django App</tspan></tspan></text> - <g - id="g4226"> - <rect - y="285.56921" - x="942.05017" - height="80.868637" - width="169.75186" - id="rect4136-6-2" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f22222;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4430-2" - y="337.17297" - x="972.03107" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4432-8" - y="337.17297" - x="972.03107" - sodipodi:role="line"><tspan - id="tspan4434-2" - style="font-size:30px" - y="337.17297" - x="972.03107">Contrib</tspan></tspan></text> - </g> - <g - id="g4247"> - <rect - y="387.47891" - x="831.36768" - height="80" - width="280" - id="rect4136-2-7" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#9dff8b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <text - sodipodi:linespacing="125%" - id="text4424-1" - y="438.64832" - x="918.58203" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - xml:space="preserve"><tspan - id="tspan4426-4" - y="438.64832" - x="918.58203" - sodipodi:role="line"><tspan - id="tspan4428-7" - style="font-size:30px" - y="438.64832" - x="918.58203">ODM</tspan></tspan></text> - </g> - <g - id="g4544" - transform="translate(-1.8984375e-5,41.381332)"> - <g - transform="translate(0,-204)" - id="g4520"> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0-2" - width="280" - height="80" - x="831.36768" - y="651.573" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="899.03369" - y="702.25177" - id="text4406-5" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="899.03369" - y="702.25177" - id="tspan4408-4"><tspan - x="899.03369" - y="702.25177" - style="font-size:30px" - id="tspan4410-9">DataBase</tspan></tspan></text> - </g> - </g> - <path - inkscape:connector-curvature="0" - id="path4224" - d="m 796.10619,376.7412 350.52301,0" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#f22222;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:8, 4;stroke-dashoffset:0;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4224-2" - d="m 796.10619,478.21661 350.52301,0" - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4163" - d="m 567.20069,275.05601 c 0,0 0,0 -50.39122,-5e-5 l 0,0 -250.65728,0 -49.47452,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03964114;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:8.31712945, 4.15856472;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4" - d="m 567.20068,580.11173 -45.28664,0 0,0 -256.26632,0 -48.97005,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <g - id="g4619" - transform="translate(0.192095,14.700016)"> - <path - inkscape:connector-curvature="0" - id="path4600" - d="m 601.3677,357.35991 141.42857,0 -25.63736,-14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4600-5" - d="m 601.46614,366.72254 141.42857,0 -25.63736,14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - </g> -</svg> diff --git a/docs/assets/images/pizza (2).jpg b/docs/assets/images/pizza (2).jpg deleted file mode 100644 index e55eca3aac252d943c71c63148a2264b35705d2c..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/pizza (2).jpg and /dev/null differ diff --git a/docs/assets/images/pizza.jpg b/docs/assets/images/pizza.jpg deleted file mode 100644 index 41cc63de92008a64b57882c1120c4557811ff9ea..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/pizza.jpg and /dev/null differ diff --git a/docs/assets/images/sagome.jpg b/docs/assets/images/sagome.jpg deleted file mode 100644 index 621e88815bd9add13c41090d4c64f275cbd41f02..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/sagome.jpg and /dev/null differ diff --git a/docs/assets/images/sql2mongodb.png b/docs/assets/images/sql2mongodb.png deleted file mode 100644 index 5fd515e605c069a8f7a2fb99c16f74993c75d2ca..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/sql2mongodb.png and /dev/null differ diff --git a/docs/assets/images/sql2mongodb.svg b/docs/assets/images/sql2mongodb.svg deleted file mode 100644 index 573bd9d4afe963438395f6b26ccb51ec8c97a171..0000000000000000000000000000000000000000 --- a/docs/assets/images/sql2mongodb.svg +++ /dev/null @@ -1,375 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="284.95142mm" - height="187.19585mm" - viewBox="0 0 1009.6703 663.29236" - id="svg2" - version="1.1" - inkscape:version="0.91 r13725" - sodipodi:docname="sql2mongodb.svg" - inkscape:export-filename="C:\Users\27989\twsent\djaosdb\bitbucket\djaosdb\docs\images\sql2mongodb.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1" - inkscape:cx="388.54173" - inkscape:cy="331.56674" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-top="10" - fit-margin-left="10" - fit-margin-right="10" - fit-margin-bottom="10" - units="mm" - inkscape:window-width="1920" - inkscape:window-height="996" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" /> - <metadata - id="metadata7"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-181.24463,-45.095066)"> - <flowRoot - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - id="flowRoot4341" - xml:space="preserve"><flowRegion - id="flowRegion4343"><rect - y="147.26552" - x="222.23357" - height="127.27922" - width="410.12195" - id="rect4345" /></flowRegion><flowPara - id="flowPara4347" /></flowRoot> <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136" - width="280" - height="80" - x="251.93918" - y="82.528145" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="303.34543" - y="130.40901" - id="text4400" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="303.34543" - y="130.40901" - id="tspan4402"><tspan - x="303.34543" - y="130.40901" - style="font-size:30px" - id="tspan4404">Django App</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-6" - width="169.75186" - height="80.868637" - x="362.62164" - y="183.77907" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="392.60257" - y="235.38283" - id="text4430" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="392.60257" - y="235.38283" - id="tspan4432"><tspan - x="392.60257" - y="235.38283" - style="font-size:30px" - id="tspan4434">Contrib</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2" - width="280" - height="80" - x="251.93918" - y="285.89865" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="339.15353" - y="337.06808" - id="text4424" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="339.15353" - y="337.06808" - id="tspan4426"><tspan - x="339.15353" - y="337.06808" - style="font-size:30px" - id="tspan4428">Models</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5" - width="280" - height="80" - x="251.93918" - y="387.58389" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="346.01633" - y="435.69913" - id="text4418" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="346.01633" - y="435.69913" - id="tspan4420"><tspan - x="346.01633" - y="435.69913" - style="font-size:30px" - id="tspan4422">Query</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1" - width="280" - height="80" - x="251.93918" - y="489.2691" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="289.18039" - y="539.94781" - id="text4412" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="289.18039" - y="539.94781" - id="tspan4414"><tspan - x="289.18039" - y="539.94781" - style="font-size:30px" - id="tspan4416">DB connector</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0" - width="280" - height="80" - x="251.93918" - y="590.95435" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="284.405" - y="639.20874" - id="text4406" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="284.405" - y="639.20874" - id="tspan4408"><tspan - x="284.405" - y="639.20874" - style="font-size:30px" - id="tspan4410">SQL DataBase</tspan></tspan></text> - <g - id="g4694" /> - <g - id="g4619" - transform="translate(0.192095,14.700016)"> - <path - inkscape:connector-curvature="0" - id="path4600" - d="m 601.3677,357.35991 141.42857,0 -25.63736,-14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - inkscape:connector-curvature="0" - id="path4600-5" - d="m 601.46614,366.72254 141.42857,0 -25.63736,14.80174" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - </g> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-3" - width="280" - height="80" - x="840.2204" - y="82.528137" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="891.62665" - y="130.40901" - id="text4400-7" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="891.62665" - y="130.40901" - id="tspan4402-3"><tspan - x="891.62665" - y="130.40901" - style="font-size:30px" - id="tspan4404-3">Django App</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.1313622;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-6-9" - width="169.75186" - height="80.868637" - x="950.90289" - y="183.77907" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="980.88379" - y="235.38283" - id="text4430-2" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="980.88379" - y="235.38283" - id="tspan4432-7"><tspan - x="980.88379" - y="235.38283" - style="font-size:30px" - id="tspan4434-5">Contrib</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-9" - width="280" - height="80" - x="840.2204" - y="285.89862" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="927.43475" - y="337.06805" - id="text4424-8" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="927.43475" - y="337.06805" - id="tspan4426-5"><tspan - x="927.43475" - y="337.06805" - style="font-size:30px" - id="tspan4428-6">Models</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-5-1" - width="280" - height="80" - x="840.2204" - y="387.58386" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="934.29755" - y="435.6991" - id="text4418-1" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="934.29755" - y="435.6991" - id="tspan4420-0"><tspan - x="934.29755" - y="435.6991" - style="font-size:30px" - id="tspan4422-6">Query</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#9dff8b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-4" - width="280" - height="80" - x="840.2204" - y="489.26907" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="854.16327" - y="537.30371" - id="text4412-9" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="854.16327" - y="537.30371" - id="tspan4414-4"><tspan - x="854.16327" - y="537.30371" - style="font-size:30px" - id="tspan4416-0">SQL to caosdb</tspan></tspan></text> - <rect - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#f0f0f0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - id="rect4136-2-1-0-2" - width="280" - height="80" - x="840.2204" - y="590.95435" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="907.77655" - y="638.76196" - id="text4406-4" - sodipodi:linespacing="125%"><tspan - sodipodi:role="line" - x="907.77655" - y="638.76196" - id="tspan4408-1"><tspan - x="907.77655" - y="638.76196" - style="font-size:30px" - id="tspan4410-4">MongoDB</tspan></tspan></text> - <path - inkscape:connector-curvature="0" - id="path4163-4" - d="m 567.20068,478.4265 -45.28664,0 0,0 -256.26632,0 -48.97005,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4-5" - d="m 567.20068,580.11172 -45.28664,0 0,0 -256.26632,0 -48.97005,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4-6" - d="m 1155.4819,478.42647 -45.2866,0 0,0 -256.26634,0 -48.97005,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - <path - inkscape:connector-curvature="0" - id="path4163-4-68" - d="m 1155.4819,580.11171 -45.2866,0 0,0 -256.26634,0 -48.97005,0" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:7.99999905, 3.99999952;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - </g> -</svg> diff --git a/docs/assets/images/sumeru.png b/docs/assets/images/sumeru.png deleted file mode 100644 index f84e4745864099cd128b58fbc231eb5353506d43..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/sumeru.png and /dev/null differ diff --git a/docs/assets/images/support.png b/docs/assets/images/support.png deleted file mode 100644 index 5d8e8ef49699a4f171ed04b4e2143c8eb29b1176..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/support.png and /dev/null differ diff --git a/docs/assets/images/white.jpg b/docs/assets/images/white.jpg deleted file mode 100644 index 099f179937f908b4458a881ed044948a03eaa022..0000000000000000000000000000000000000000 Binary files a/docs/assets/images/white.jpg and /dev/null differ diff --git a/docs/docs/Discuss.md b/docs/docs/Discuss.md deleted file mode 100644 index 89e142f9f6cc0e73967c7d77d13bee568d1ba23c..0000000000000000000000000000000000000000 --- a/docs/docs/Discuss.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Discussion Board -permalink: /discuss/ -toc: false -layout: splash ---- - -{% include empty_banner %} - -Djongo forum is where you can watch for: - -* New release announcements. -* Suggest improvements. -* Ask questions. -* Discuss topics pertaining to Django and MongoDB. - -<iframe id="forum_embed" - src="javascript:void(0)" - scrolling="no" - frameborder="0" - width="100%" - height="700"> -</iframe> - -<script type="text/javascript"> - document.getElementById('forum_embed').src = - 'https://groups.google.com/forum/embed/?place=forum/djaosdb' - + '&showsearch=true&showpopout=true&showtabs=false' - + '&parenturl=' + encodeURIComponent(window.location.href); -</script> \ No newline at end of file diff --git a/docs/docs/different-ways-to-integrate-django-with-mongodb.md b/docs/docs/different-ways-to-integrate-django-with-mongodb.md deleted file mode 100644 index 07174df8f73f1f6b8f301992775edf09082a05f5..0000000000000000000000000000000000000000 --- a/docs/docs/different-ways-to-integrate-django-with-mongodb.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Djongo vs Others -permalink: /djaosdb-comparison/ -description: This page describes how to integrate MongoDB with Django with focus on Djongo. It describes the Django ORM internal implementation that is not covered by the Django documentation. ---- - -This page describes how to integrate MongoDB with Django with focus on Djongo. It describes the Django ORM internal implementation that is not covered by the [Django documentation](https://docs.djangoproject.com/en/dev/). If you have not yet checked out the [introduction to Djongo](https://nesdis.github.io/djaosdb/), be sure to do so first! - -There are different ways to integrate MongoDB with Django, each with positives and negatives. Insights into the Django ORM design will help understand ways to integrate MongoDB and Django. - -## Django ORM internals - -The Django ORM can be broadly thought of as multiple Abstraction Layers stacked on top of each other. - -<div style="max-width: 150px; margin-left: auto; margin-right: auto"> - <img src="/djaosdb/assets/images/layers.svg" alt="Abstraction Layers"> -</div> - - -## Models Layer - -Your Django App and [Contrib](https://docs.djangoproject.com/en/dev/ref/contrib/) packages interface with the Models API to implement their functionality. - -## Query Layer - -The Query Layer converts Models functionality into Django SQL query strings that are similar to Sqllite query syntax. - -## DB connector - -The Django SQL query string is converted to backend database specific SQL syntax. - -## Database - -The Database only accepts SQL query string specific to its type. - - -## Ways to integrate Django with MongoDB - -### From ORM to ODM - -Object Document Mapping (ODM) is the Object Relational Mapping (ORM) for non-relational document oriented databases (like MongoDB). In an ODM, python objects (or group of them) are stored as documents instead of tables. Implementing an ODM for Django would entail rewriting several Django modules. - -<div style="max-width: 400px; margin-left: auto; margin-right: auto"> - <img src="/djaosdb/assets/images/orm2odm.svg" alt="Abstraction Layers"> -</div> - -### Django-nonrel - -[Django-nonrel](https://github.com/django-nonrel/django) aims to integrate Django and MongoDB but is not up to date with the latest version of Django. - -## Django SQL to MongoDB transpiler - -A different approach is to translate Django SQL query syntax into caosdb commands. - - <div style="max-width: 400px; margin-left: auto; margin-right: auto"> - <img src="/djaosdb/assets/images/sql2mongodb.svg" alt="Abstraction Layers"> -</div> - -This has several advantages - -### Reuse Django Models - - Django is a stable framework with continuous development and enhancements. The [Django ORM](https://docs.djangoproject.com/en/dev/topics/db/models/) is quite extensive and feature rich. Defining *a third party* ORM to work with MongoDB means reproducing the entire Django ORM again. The new ORM needs to constantly align with the Django ORM. Several Django features will never make it into the third party ORM. The idea behind Djongo is to **reuse** existing Django ORM features by finally translating SQL queries to MongoDB syntax. - -### Future proof your code - - As **SQL syntax will never change** regardless of future additions to Django, by using Djongo your code is now future proof! - -### Goodbye migrations - -MongoDB is a [schema free](https://docs.mongodb.com/manual/data-modeling/) DB. You no longer need to run <code> manage.py migrate</code> every time you change a model. Making changes to your models is easier. - -### Work on the Real Django - -Djongo does not make you use a forked version of Django, access MongoDB with the Real Django framework. - -## Common misconceptions - -### Relational data cannot be represented within a non relational data store - -Relations between objects and subsequent joins can be done in non relational data stores by performing multiple [application level lookups](https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-2) - -### Unstructured database cannot store structured data - -Unstructured data is a super set of structured data. Specifying the data structure to MongoDB will only be ignored by it. - -More details on [implementing Django MongoDB connector](/djaosdb/django-mongodb-connector-design-document/) can be found in the design document. - - diff --git a/docs/docs/django-mongodb-connector-design-document.md b/docs/docs/django-mongodb-connector-design-document.md deleted file mode 100644 index 029a7e7f56e016788706c0f7c0b87e3f1eac786b..0000000000000000000000000000000000000000 --- a/docs/docs/django-mongodb-connector-design-document.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Django and MongoDB Connector Design -permalink: /django-mongodb-connector-design-document/ ---- - -## SQL to MongoDB query mapping. - -SQL query | caosdb API -----------|------------ -SELECT | find(projection=) -WHERE | find(filter=) -AND | $and -OR | $or -NOT | $neq -IN | $in -INNER JOIN | find(), find(), find() -LEFT JOIN | aggregate($lookup) -UPDATE | update_many -DELETE | delete_many -INSERT INTO | insert_many -CREATE DATABASE | implicit -ALTER DATABASE | implicit -CREATE TABLE | implicit -ALTER TABLE | implicit -DROP TABLE | drop_collection -CREATE INDEX | create_indexes -DROP INDEX | drop_index - -## Performing relational SQL JOINs in MongoDB - -Since MongoDB does not have an intrinsic JOIN command the multi-collection JOIN must be done at the application layer. Due to the intrinsic design of MongoDB, if a parallel thread does an update operation on the **same set of documents** on which JOIN is taking place, there is a possibility of getting different results than expected. This possibility exists in multi-threaded SQL implementations as well. - -Application layer multi-collection JOINS without any interleaved database updates are thread safe and can be done in MongoDB. In case you feel SQL joins confusing there is an excellent explanation on how [sql joins work](https://www.interfacett.com/blogs/multiple-joins-work-just-like-single-joins/) which can be referred to before proceeding further. - -Here is an example of a typical SQL query generated by Django admin while modifying a user property. - -```sql -SELECT "auth_permission"."id", "auth_permission"."name", "auth_permission"."content_type_id", "auth_permission"."codename", "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" -FROM "auth_permission" -INNER JOIN "django_content_type" - ON ("auth_permission"."content_type_id" = "django_content_type"."id") -ORDER BY - "django_content_type"."app_label" ASC, - "django_content_type"."model" ASC, - "auth_permission"."codename" ASC -``` - -INNER JOIN translates to: - -```python -docs = db['auth_permission'].find( - {}, - {'content_type_id': True, '_id': False} -).to_list() - -joined_docs = db['django_content_type'].find( - {'id': {'$in': [doc['content_type_id'] for doc in docs]}}, - {'id': True, '_id': False} -).to_list() - -# Finally, project the SELECTed fields with content_type_id in joined_docs -``` -So INNER JOIN can basically be done using three application level find operations out of which 2 are for lookups. - -Consider a complex multi-join SQL query - -```sql -SELECT "auth_permission"."id", "auth_permission"."name", "auth_permission"."content_type_id", "auth_permission"."codename" -FROM "auth_permission" -INNER JOIN "auth_user_user_permissions" - ON ("auth_permission"."id" = "auth_user_user_permissions"."permission_id") -INNER JOIN "django_content_type" - ON ("auth_permission"."content_type_id" = "django_content_type"."id") -ORDER BY - "django_content_type"."app_label" ASC, - "django_content_type"."model" ASC, - "auth_permission"."codename" ASC -``` - -This can be performed using 4 lookups inside python. - -```python -docs = db['auth_permission'].find( - {}, - {'id': True, '_id': False} -).to_list() - -joined_docs = db['auth_user_user_permissions'].find( - {'permission_id': {'$in': [doc['id'] for doc in docs]}}, - {'permission_id': True, '_id': False} -).to_list() - -joined_docs2 = db['auth_permission'].find( - {'id': {'$in': [doc['permission_id'] for doc in joined_docs]}}, - {'content_type_id': True, '_id': False} -).to_list() - -joined_docs3 = db['django_content_type'].find( - {'id': {'$in': [doc['content_type_id'] for doc in joined_docs2]}}, - {'id': True, '_id': False} -).to_list() - -# Finally, project the SELECTed fields with id in joined_docs3 -``` - -LEFT JOIN or LEFT OUTER JOIN can be done using similar lookup operations. - - diff --git a/docs/docs/djongo-deep-dive.md b/docs/docs/djongo-deep-dive.md deleted file mode 100644 index f321875bf94eac0bbc8f18d5819ec736e423a167..0000000000000000000000000000000000000000 --- a/docs/docs/djongo-deep-dive.md +++ /dev/null @@ -1,256 +0,0 @@ ---- -title: Django and MongoDB connector -permalink: /djaosdb-deep-dive/ ---- - -{{ page.notice.sponsor }} - -## Database configuration - -The `settings.py` supports (but is not limited to) the following options: - -Attribute | Value | Description ----------|------|------------- -ENGINE | djaosdb | The MongoDB connection engine for interfacing with Django. -ENFORCE_SCHEMA | True | Ensures that the model schema and database schema are exactly the same. Raises `Migration Error` in case of discrepancy. -ENFORCE_SCHEMA | False | (Default) Implicitly creates collections. Returns missing fields as `None` instead of raising an exception. -NAME | your-db-name | Specify your database name. This field cannot be left empty. -LOGGING | dict | A [dictConfig](https://docs.python.org/3.6/library/logging.config.html) for the type of logging to run on djaosdb. -CLIENT | dict | A set of key-value pairs that will be passed directly to [`MongoClient`]((http://api.mongodb.com/python/current/api/caosdb/mongo_client.html#caosdb.mongo_client.MongoClient)) as kwargs while creating a new client connection. - -All options except `ENGINE` and `ENFORCE_SCHEMA` are the same those listed in the [caosdb documentation](http://api.mongodb.com/python/current/api/caosdb/mongo_client.html#caosdb.mongo_client.MongoClient). - - -```python - DATABASES = { - 'default': { - 'ENGINE': 'djaosdb', - 'NAME': 'your-db-name', - 'ENFORCE_SCHEMA': False, - 'CLIENT': { - 'host': 'host-name or ip address', - 'port': port_number, - 'username': 'db-username', - 'password': 'password', - 'authSource': 'db-name', - 'authMechanism': 'SCRAM-SHA-1' - }, - 'LOGGING': { - 'version': 1, - 'loggers': { - 'djaosdb': { - 'level': 'DEBUG', - 'propagate': False, - } - }, - }, - } - } -``` - -### Enforce schema - -MongoDB is *schemaless*, which means no schema rules are enforced by the database. You can add and exclude fields per entry and MongoDB will not complain. This can make life easier, especially when there are frequent changes to the data model. Take for example the `Blog` Model (version 1). - -```python -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() -``` - -You can save several entries into the DB and later modify it to version 2: - -```python -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - description = models.TextField() -``` - -The modified Model can be saved **without running any migrations**. - -This works fine if you know what you are doing. Consider a query that retrieves entries belonging to both the 'older' model (with just 2 fields) and the current model. What will the value of `description` now be? To handle such scenarios Djongo comes with the `ENFORCE_SCHEMA` option. - -When connecting to Djongo you can set `ENFORCE_SCHEMA: True`. In this case, a `MigrationError` will be raised when field values are missing from the retrieved documents. You can then check what went wrong. - -`ENFORCE_SCHEMA: False` works by silently setting the missing fields with the value `None`. If your app is programmed to expect this (which means it is not a bug) you can get away by not calling any migrations. - -## Use Django Admin to add documents - -The Django Admin interface can be used to work with MongoDB. Additionally, several MongoDB specific features are supported using [EmbeddedField](/djaosdb/using-django-with-mongodb-data-fields/), [ArrayField](/djaosdb/using-django-with-mongodb-array-field/) and other fields. Let’s say you want to create a blogging platform using Django with MongoDB as your backend. In your Blog `app/models.py` file define the `Blog` model: - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True -``` - -Now ‘embed’ your `Blog` inside a `Entry` using the `EmbeddedField`: - -```python -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - ) - - headline = models.CharField(max_length=255) -``` - -Register your `Entry` in `admin.py`: - -```python -from django.contrib import admin -from .models import Entry - -admin.site.register(Entry) -``` - -That’s it you are set! Fire up Django Admin on localhost:8000/admin/ and this is what you get: - - - - - -### Querying Embedded fields - -In the above example, to query all Entries with Blogs which have names that start with *Beatles*, use the following query: - -```python -entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) -``` - -Refer to [Using Django with MongoDB data fields](/djaosdb/using-django-with-mongodb-data-fields/) for more details. - -## Djongo Manager - -Djongo Manager extends the functionality of the usual [Django Manager](https://docs.djangoproject.com/en/dev/topics/db/managers/). It gives direct access to the caosdb collection API. To use this manager define your manager as `DjongoManager` in the model. - - ```python -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - ) - headline = models.CharField(max_length=255) - objects = models.DjongoManager() -``` - -Use it like the usual Django manager: - -```python -post = Entry.objects.get(pk=p_key) -``` - -Will [get a model object](https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-a-single-object-with-get) having primary key `p_key`. - -### Using Pymongo commands - -MongoDB has powerful query syntax and `DjongoManager` lets you exploit it fully. For the above `Entry` model define a custom query function: - -```python -class EntryView(DetailView): - - def get_object(self, queryset=None): - index = [i for i in Entry.objects.mongo_aggregate([ - { - '$match': { - 'headline': self.kwargs['path'] - } - }, - ])] - - return index - -``` - -You can directly **access any** [caosdb command](https://api.mongodb.com/python/current/) by prefixing `mongo_` to the command name. -{: .notice} - -For example, to perform `aggregate` on the BlogPage collection (BlogPage is stored as a table in SQL or a collection in MongoDB) the function name becomes `mongo_aggregate`. To directly insert a document (instead of `.save()` a model) use `mongo_insert_one()` - -## GridFS - -To save files using [GridFS](https://docs.mongodb.com/manual/core/gridfs/) you must create a file storage instance of `GridFSStorage`: - -```python -grid_fs_storage = GridFSStorage(collection='myfiles') -``` - -In your model define your field as `FileField` or `ImageField` as usual: - -```python -avatar = models.ImageField(storage=grid_fs_storage, upload_to='') -``` - -Refer to [Using GridFSStorage](/djaosdb/using-django-with-mongodb-gridfs/) for more details. - - -## Migrating an existing Django app to MongoDB - -When migrating an existing Django app to MongoDB, it is recommended to start a new database on MongoDB. For example, use `myapp-djaosdb-db` in your `settings.py` file. - -1. Into `settings.py` file of your project, add: - - ```python - DATABASES = { - 'default': { - 'ENGINE': 'djaosdb', - 'NAME': 'myapp-djaosdb-db', - } - } - ``` - -2. Run `manage.py makemigrations <myapp>` followed by `manage.py migrate`. -3. Open Django Admin and you should find all Models defined in your app, showing up in the Admin. -4. While the relevant collections have been created in MongoDB, they have have no data inside. -5. Continue by inserting data into the collections manually, or use Django Admin for a GUI. - -## Setting up an existing MongoDB database on Django - -### The internal `__schema__` collection - -There is no concept of an AUTOINCREMENT field in MongoDB. Therefore, Djongo internally creates a `__schema__` collection to track such fields. The `__schema__` collection looks like: - -```python -{ - "_id" : ObjectId("5a5c3c87becdd9fe2fb255a9"), - "name" : "django_migrations", - "auto" : { - "field_names" : [ - "id" - ], - "seq" : NumberInt(14) - } -} -``` -For every collection in the DB that has an autoincrement field, there is an corresponding entry in the `__schema__` collection. Running `manage.py migrate` automatically creates these entries. - -Now there are 2 approaches to setting up your existing data onto MongoDB: - -### Zero risk - -1. Start with a new database name in `settings.py`. -2. If you have not already done so, define your models in the `models.py` file. The model names and model fields have to be exactly the same, as the existing data that you want to setup. -3. Run `manage.py makemigrations <app_name>` followed by `manage.py migrate`. -4. Now your empty DB should have a `__schema__` collection, and other collections defined in the `model.py` file. -5. Copy collection data (of your custom models defined in `model.py`) to the new DB. -6. In `__schema__` collection make sure that the `seq` number of your AUTOINCREMENT fields is **set to the latest value**. This should correspond to the document count for each model. For example, if your model has 16 entries (16 documents in the DB), then `seq` should be set as 16. Usually the AUTOINCREMENT field is called `id`. - -However, if you do not want to create a new database (and copy existing data into this new database), you can try this approach: - -### Medium risk - -1. Start with an empty database. You can always delete this later. -2. Same as before. -3. Same as before. -4. Now copy the `__schema__` collection from the new database (from step1) to the existing database. -5. Same as step 6 from before. -6. You can now delete the database created in step 1. - -*You are now done setting up Django with MongoDB. Start using Django with MongoDB, like you would with any other database backend.* - -{% include links %} \ No newline at end of file diff --git a/docs/docs/djongonxt/creating-django-capped-models-using-mongodb.md b/docs/docs/djongonxt/creating-django-capped-models-using-mongodb.md deleted file mode 100644 index 8a0ab23f8d2aec9ce81d4f41c793fd3bf4d1e523..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/creating-django-capped-models-using-mongodb.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Creating Capped Models using MongoDB -permalink: /creating-django-capped-models-using-mongodb/ ---- - -[Capped collections][capped] are fixed-size collections that support high-throughput operations that insert and retrieve documents based on insertion order. Capped collections work in a way similar to circular buffers: once a collection fills its allocated space, it makes room for new documents by overwriting the oldest documents in the collection. - -Djongo lets you define certain Models as 'Capped' Models. The `Entry` Model is a perfect candidate for being stored as a Capped Model. - -```python -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - model_form_class=BlogForm - ) - meta_data = models.EmbeddedField( - model_container=MetaData, - model_form_class=MetaDataForm - ) - - headline = models.CharField(max_length=255) - body_text = models.TextField() - - authors = models.ArrayReferenceField( - to=Author, - on_delete=models.CASCADE, - ) - n_comments = models.IntegerField() - - class Meta: - capped = True - size = 5242880 - max = 5000 - - def __str__(self): - return self.headline - -``` - -As most SQL DBs do not support capped tables, Django lacks a way to define such tables during a migration. Djongo comes with it is own version of `manage.py` to make this happen. Switch to the root directory of your app and from the command line run: - -``` -python -m djaosdb.manage migrate -``` - -This will result in all Models having `capped == True` to being recreated as Capped collections. Use this command only if such a collection doesn't already exists or is empty, as `djaosdb.manage` will drop all collections marked as capped in the model but are not capped in the DB and create a new empty capped collection. - -{{page.notice.not_ready}} - -[capped]: https://docs.mongodb.com/manual/core/capped-collections/ \ No newline at end of file diff --git a/docs/docs/djongonxt/djongonxt-aggregation.md b/docs/docs/djongonxt/djongonxt-aggregation.md deleted file mode 100644 index 7c4c5cf08ec31800c635034d36c008804776edeb..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-aggregation.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: DjongoNxt Aggregation -permalink: /djaosdbnxt-aggregation/ ---- - -## Using Aggregation Operators - - -<!-- -## Django Admin MongoDB dashboard - -<A pic?> - -Djongo dashboard is a web interface integrated with Django Admin for controlling and monitoring the status of the MongoDB server - -<What types can I monitor> -Raw SQL support -C binaries for improved performance -Issue analysis and resolution -Change stream cursor - ---> \ No newline at end of file diff --git a/docs/docs/djongonxt/djongonxt-database-transactions.md b/docs/docs/djongonxt/djongonxt-database-transactions.md deleted file mode 100644 index e64d8e453986e6baaaf487c907addaba587498a5..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-database-transactions.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: DjongoNxt Database Transactions -permalink: /djaosdbnxt-database-transactions/ ---- - - -## Transaction and Commit - -Djongo integrates with MongoDB Transactions API to support multi document atomic transactions. [Atomic transactions](https://docs.djangoproject.com/en/3.0/topics/db/transactions/) are enabled in Django using the usual `transaction.atomic()` decorator or context manager. MongoDB transactions significantly speed up Django test execution and validation. - -### Example - -```python -from djaosdb import transaction - -def viewfunc(request): - stuff() - - with transaction.atomic(): - # This code executes inside a transaction. - more_stuff() -``` - -This produces the following caosdb commands: - -```python -session = cli.start_session() -transaction = session.start_transaction() -# more_stuff -transaction.commit_transaction() # or transaction.abort_transaction() -session.end_session() -``` diff --git a/docs/docs/djongonxt/djongonxt-indexes.md b/docs/docs/djongonxt/djongonxt-indexes.md deleted file mode 100644 index c4c2a36c1c899630f3928135f72a0d5dc84149ff..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-indexes.md +++ /dev/null @@ -1,239 +0,0 @@ ---- -title: DjongoNxt Indexes -permalink: /djaosdbnxt-indexes/ ---- - -## Compound Index -```python -class CompoundIndex( - fields=(), - name=None, - unique=False, - background=False, - partialFilterExpression=None, - sparse=False, - collation=None) -``` - -### Arguments - -Argument | Type | Description ----------|------|------------- -`fields` | `Tuple` or `List` | A tuple of strings containing the fields to be indexed. Adding a '-' before the field name, builds the index in the [descending order](https://docs.djangoproject.com/en/dev/ref/models/indexes/#django.db.models.Index.fields). -`name` | `string` | The index name, if not provided will be autogenerated by MongoDB -`unique` | `boolean` | Used to create [unique indexes](https://docs.mongodb.com/manual/core/index-unique/) -`background` | `boolean` | Create the index in the background. -`partialFilterExpression` | `Q` | Used to create [partial indexes](https://docs.mongodb.com/manual/core/index-partial/). Similar to Django [Index condition](https://docs.djangoproject.com/en/dev/ref/models/indexes/#condition). Takes an instance of [Q](https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Q) to build the filter expression. -`sparse` | `boolean` | Used to create [sparse indexes](https://docs.mongodb.com/manual/core/index-sparse/) -`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [collation](https://api.mongodb.com/python/current/api/caosdb/collation.html) - -### Example - -```python -from djaosdb.models.indexes import CompoundIndex -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - indexes = [ - CompoundIndex(fields=['name', '-tagline']) - ] -``` - -Generates the caosdb command: - -```python -db.blog.create_index( { 'name': 1, 'tagline': -1 } ) -``` - -## Text Index - -```python -class TextIndex( - fields=(), - name=None, - unique=False, - background=False, - partialFilterExpression=None, - weights=None, - default_language='english', - language_override=None, - textIndexVersion=None) -``` -### Example - -```python -from djaosdb.models.indexes import TextIndex -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - indexes = [ - TextIndex(fields=['name', 'tagline']) - ] -``` - -Generates the caosdb command: - -```python -db.blog.create_index( { 'name': 'text', 'tagline': 'text' } ) -``` - -## Wildcard Index - -```python -class WildcardIndex( - fields=(), - name=None, - unique=False, - background=False, - partialFilterExpression=None, - sparse=False, - collation=None, - wildcardProjection=None) -``` -### Example - -```python -from djaosdb.models.indexes import WildcardIndex -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - ) - class Meta: - indexes = [ - WildcardIndex(fields=['blog']) - ] -``` -Generates the caosdb command: - -```python -db.entry.create_index( { 'blog.$**': 1 } ) -``` - -## 2dsphere Index -```python -class TwoDSphereIndex( - fields=(), - name=None, - unique=False, - background=False, - partialFilterExpression=None, - sparse=False, - collation=None, - min=None, - max=None) -``` -### Example - -```python -from djaosdb.models.indexes import TwoDSphereIndex -from djaosdb import models - -class Location(models.Model): - type = models.CharField(max_length=100) - coordinates = models.ArrayField() - - class Meta: - abstract = True - -class Entry(models.Model): - loc = models.EmbeddedField( - model_container=Location, - ) - class Meta: - indexes = [ - TwoDSphereIndex(fields=['loc']) - ] -``` -Generates the caosdb command: - -```python -db.entry.create_index( { 'loc' : '2dsphere' } ) -``` - -## Hashed Index -```python -class HashedIndex( - fields=(), - name=None, - unique=False, - background=False, - partialFilterExpression=None, - sparse=False, - collation=None) -``` -### Example - -```python -from djaosdb.models.indexes import HashedIndex -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - indexes = [ - HashedIndex(fields=['name']) - ] -``` - -Generates the caosdb command: - -```python -db.blog.create_index( { 'name': 'hashed' } ) -``` - -## TTL Index -```python -class TTLIndex( - field=, - name=None, - unique=False, - background=False, - partialFilterExpression=None, - sparse=False, - collation=None, - expireAfterSeconds=None) -``` -### Example - -```python -from djaosdb.models.indexes import TTLIndex -from djaosdb import models - -class Blog(models.Model): - pub_date = models.DateTimeField() - - class Meta: - indexes = [ - TTLIndex(field='pub_date', expireAfterSeconds=3600) - ] -``` - -Generates the caosdb command: - -```python -db.blog.create_index( { 'pub_date': 1 }, expireAfterSeconds=3600 ) -``` -<!-- -## geoHaystack Indexes ---> - - diff --git a/docs/docs/djongonxt/djongonxt-model-creation.md b/docs/docs/djongonxt/djongonxt-model-creation.md deleted file mode 100644 index 810d09e00a346b81783076de76696403ddf85346..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-model-creation.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: DjongoNxt Model Creation -permalink: /djaosdbnxt-model-creation/ ---- - - -## Schema Validation and CheckConstraint - -Djongo automatically generates schema validation JSON documents for your models providing an extra layer of data validation and checking from within MongoDB. By creating [check constraints](https://docs.djangoproject.com/en/3.0/ref/models/constraints/#checkconstraint) in the Model Meta definition, djaosdb automatically interprets it to generate a [JSON Schema](https://docs.mongodb.com/manual/core/schema-validation/#json-schema) and a [query expression](https://docs.mongodb.com/manual/core/schema-validation/#other-query-expressions) - -### Example - -```python -from djaosdb.models import CheckConstraint, Q -from djaosdb import models -from caosdb.read_concern import ReadConcern - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - author_age = models.IntegerField() - - class Meta: - constraints = [ - CheckConstraint(check=Q(author_age__gte=18), name='age_gte_18') - ] -``` - -## CollectionConstraint and Capped Collections -Djongo introduces a new `CollectionConstraint`. Use this to specify MongoDB specific collection properties that are usually used when calling [create_collection](https://api.mongodb.com/python/current/api/caosdb/database.html#caosdb.database.Database.create_collection) - -```python -class CollectionConstraint(**kwargs) -``` - -All arguments passed to `create_collection` with the exception of `name` can be used to create the `CollectionConstraint` instance. Valid arguments include, but are not limited to those described below - -### Arguments - -Argument | Type | Description ----------|------|------------- -`codec_options` | `CodecOptions` | An instance of [CodecOptions](https://api.mongodb.com/python/current/api/bson/codec_options.html#bson.codec_options.CodecOptions). -`collation` | `Collation` | Takes an instance of [Collation](https://api.mongodb.com/python/current/api/caosdb/collation.html) - -### Example - -```python -from djaosdb.models import CollectionConstraint -from djaosdb import models -from caosdb.read_concern import ReadConcern - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - constraints = [ - CollectionConstraint( - read_concern=ReadConcern(level='majority'), - capped=True, - max=100 - ) - ] -``` - - diff --git a/docs/docs/djongonxt/djongonxt-model-query.md b/docs/docs/djongonxt/djongonxt-model-query.md deleted file mode 100644 index 32c80994e8dbe098ec2cb45ae87b4d9bc59a837d..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-model-query.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: DjongoNxt Model Query -permalink: /djaosdbnxt-model-query/ ---- - -## Text Search - -Djongo lets you run [MongoDB text search](https://docs.mongodb.com/manual/core/text-search-operators/) queries on Django `CharField` and `TextField`. To run a text search, use the `text_search` operator that comes built in with Djongo. - -### Example - -```python -from djaosdb.models.indexes import TextIndex -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - indexes = [ - TextIndex(fields=['name']) - ] -``` - -```python -Blog.objects.filter(name__text_search='Paul Lennon') -``` -This will generate the caosdb command: - -```python -db.blog.find( { '$text': { '$search': "Paul Lennon" } } ) -``` - -<!-- -## Text Search using aggregation ---> - -## Geospatial Queries - -Geospatial queries are carried out in Djongo by using a combination of the `near` lookup operator and the `Near` search object. - -```python -class Near( - type=None, - coordinates=None, - minDistance=None, - maxDistance=None) -``` -### Example - -```python -from djaosdb.models.indexes import TwoDSphereIndex -from djaosdb import models - -class Location(models.Model): - type = models.CharField(max_length=100) - coordinates = models.ArrayField() - - class Meta: - abstract = True - -class Entry(models.Model): - loc = models.EmbeddedField( - model_container=Location, - ) - class Meta: - indexes = [ - TwoDSphereIndex(fields=['loc']) - ] -``` - -```python -from djaosdb.models import Near - -search_region = Near( - type='point', - coordinates=[-33.9, 89.81], - minDistance=100, - maxDistance=200 -) - -Entry.objects.filter(loc__near=search_region) -``` - -This generates the following caosdb search query: - -```python -db.entry.find({ - 'loc': - { '$near': - { - '$geometry': { 'type': "Point", 'coordinates': [-33.9, 89.81] }, - '$minDistance': 100, - '$maxDistance': 200 - } - } - }) -``` - -## Specifying Query Options - -Djongo lets you specify the configuration of the find command into your [QuerySets](https://docs.djangoproject.com/en/dev/ref/models/querysets/). Call the `configure` method on a QuerySet to configure the find query. All options supported by [aggregate](https://api.mongodb.com/python/current/api/caosdb/collection.html#caosdb.collection.Collection.aggregate) or [find](https://api.mongodb.com/python/current/api/caosdb/collection.html#caosdb.collection.Collection.find) can be included as `kwargs`. Example of valid arguments: - -### Arguments - -Argument | Type | Description ----------|------|------------- -`allowDiskUse` | `boolean` | Enables writing to temporary files -`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [Collation](https://api.mongodb.com/python/current/api/caosdb/collation.html) - - -### Example - -```python -Blog.objects.filter(name='John Lennon').configure(hint=['-tagline']) -``` -This generates the following caosdb find query: - -```python -db.blog.find({'name': 'John Lennon'}, hint=[('tagline', caosdb.DESCENDING)]) -``` - -## Tailable Cursors -Tailable cursors are used to retrieve data from [capped collections](https://docs.mongodb.com/manual/core/capped-collections/). The querySet first has to be configured using `configure` to use a tailable cursor in the caosdb find command. Results of the querySet can only be accessed by generating an iterator by calling the [QuerySet iterator](https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator) - -### Example - -```python -iterable = Blog.objects.filter(name='John').configure(cursor_type=CursorType.TAILABLE).iterator() -for blog in iterable: - blog.name -``` - - diff --git a/docs/docs/djongonxt/djongonxt-model-update.md b/docs/docs/djongonxt/djongonxt-model-update.md deleted file mode 100644 index aeb2008a39345850eedd53e373cc888624dbb506..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-model-update.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: DjongoNxt Model Update -permalink: /djaosdbnxt-model-update/ ---- - -## Bulk Write - -MongoDB lets you perform [Bulk Write operations](https://docs.mongodb.com/manual/core/bulk-write-operations/) using [`bulk_write`](https://api.mongodb.com/python/current/api/caosdb/collection.html#caosdb.collection.Collection.bulk_write) which is currently not supported in Django. However, by using Djongo it is possible to perform bulk writes. - -```python -class BulkWrite(ordered=True) -``` - -### Arguments - -Argument | Type | Description ----------|------|------------- -`ordered` | `boolean` | Perform the write operations either in order or arbitrarily. - -### Example - - ```python -from djaosdb import BulkWrite - -with BulkWrite(): - entry = Entry.objects.get(pk=p_key) # Queries the DB once - entry.headline = 'The Beatles reconcile' - entry.save() # Djongo does not really do a update to MongoDB - Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB - -# On exit, does: db.entry.bulk_write([UpdateOne(), InsertOne()]) -``` - -## Unordered Bulk Writes - -### Example - - ```python -from djaosdb import BulkWrite - -with BulkWrite(ordered=False): - entry = Entry.objects.get(pk=p_key) # Queries the DB once - entry.headline = 'The Beatles reconcile' - entry.save() # Djongo does not really do a update to MongoDB - Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB - -# On exit, does: -# db.entry.bulk_write( -# [UpdateOne(), InsertOne()] -# ordered=False) -``` diff --git a/docs/docs/djongonxt/djongonxt-more-info.md b/docs/docs/djongonxt/djongonxt-more-info.md deleted file mode 100644 index 22c7bc35f2a28a83ad158ffa46d6dd12bda01258..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt-more-info.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: More Information -permalink: /djaosdbnxt-more-info/ -toc: false ---- - -<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSeWunY1n3wah-Dblf6rzkNIOeO1bbUmDrC2kDPu2GXDsVgu6g/viewform?embedded=true" width="640" height="1110" frameborder="0" marginheight="0" marginwidth="0">Loading…</iframe> \ No newline at end of file diff --git a/docs/docs/djongonxt/djongonxt.md b/docs/docs/djongonxt/djongonxt.md deleted file mode 100644 index 10a37dacb2e71b0c8165c3a3407d4839967d8cc6..0000000000000000000000000000000000000000 --- a/docs/docs/djongonxt/djongonxt.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: DjongoNxt -permalink: /djaosdbnxt/ -toc: false ---- - -> Features supported in DjongoNxt are not a part of the standard Djongo package. Visit the [sponsors page][sponsor_page] for more information. - -DjongoNxt is a Django and MongoDB connector for full featured database usage. It provides many features of MongoDB enabled through Django. It comes with support for: - -### Indexes - -Support for all indexes provided by MongoDB, for example 2dSphere Index, Text Index and Compound Indexes. - -### Model Query - -Support for GeoSpatial Queries and Tailable Cursors. - -### Model Update - -Unordered and Ordered Bulk Writes. - -### Database Transactions - -Atomic multi document transactions with commit and rollback support. - -### Schema Validation and Model Creation - -Automatic JSON Schema validation document generation and options to add Read and Write Concerns for the Models. - -### Aggregation Operators - -Support for various aggregation operators provided by MongoDB. - -{% include links %} \ No newline at end of file diff --git a/docs/docs/donate.md b/docs/docs/donate.md deleted file mode 100644 index a223f701a72dfb2cc25ffe03da9dc8f3befa1620..0000000000000000000000000000000000000000 --- a/docs/docs/donate.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Donate -permalink: /donate/ -toc: false ---- - -* At the time of payment checkout, **you don't need to** provide accurate personal information as we don't store it. -* In the additional payment description box, do ensure to mention the issue or feature you want prioritized. - -[Donate](http://paypal.me/nesdis){: .btn .btn--success} \ No newline at end of file diff --git a/docs/docs/fields/mongodb-field-reference.md b/docs/docs/fields/mongodb-field-reference.md deleted file mode 100644 index 9684656c84cfa780a9dd1e4fa9ba4eb77d76184a..0000000000000000000000000000000000000000 --- a/docs/docs/fields/mongodb-field-reference.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: MongoDB Field Reference -permalink: /mongodb-field-reference/ ---- - -## ObjectIdField - -```python -class ObjectIdField(Field): - def __init__(self, *args, **kwargs): -``` - -### Arguments - -Same as the `Field` Base class - -## ListField - -> Note: To be depreciated soon and replaced with a `JSONField` - -```python -class ListField(Field): - def __init__(self, *args, **kwargs): -``` - -### Arguments - -Same as the `Field` Base class - - - diff --git a/docs/docs/fields/using-django-with-mongodb-array-field.md b/docs/docs/fields/using-django-with-mongodb-array-field.md deleted file mode 100644 index 443a36a5575d932430e25a6696fc8d9e339fbf32..0000000000000000000000000000000000000000 --- a/docs/docs/fields/using-django-with-mongodb-array-field.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Using Djongo Array Model Field -permalink: /using-django-with-mongodb-array-field/ ---- - -## ArrayField - -With Djongo there can be an [array](https://docs.mongodb.com/manual/core/document/#arrays) of embedded documents inside the parent document. You can create an **embed array/list of models inside the parent model** and store it directly into MongoDB. - -```python -class ArrayField(MongoField): - def __init__(self, - model_container: typing.Type[Model], - model_form_class: typing.Type[forms.ModelForm] = None, - model_form_kwargs: dict = None, - *args, **kwargs): -``` - -### Arguments - -Argument | Type | Description ----------|------|------------- -`model_container` | `models.Model` | The child model class type (not the instance) that this array field will contain. -`model_form_class` | `models.forms.ModelForm` | The child model form class type of the array model. All child models inside the array must be of the same type. Mixing different types of child models inside the embedded array is not supported. -`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. - -### Example - -```python -from djaosdb import models -from django import forms - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class BlogForm(forms.ModelForm): - class Meta: - model = Blog - fields = ( - 'name', 'tagline' - ) - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - class Meta: - abstract = True - -class AuthorForm(forms.ModelForm): - class Meta: - model = Author - fields = ( - 'name', 'email' - ) - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - model_form_class=BlogForm - ) - - headline = models.CharField(max_length=255) - authors = models.ArrayField( - model_container=Author, - model_form_class=AuthorForm - ) - - objects = models.DjongoManager() -``` -### Creating Array fields - -A Model with an Array field can be created as follows: - -```python -entry = Entry() -entry.authors = [{'name': 'John', 'email': 'john@mail.com'}, - {'name': 'Paul', 'email': 'paul@mail.com'}] -entry.save() -``` - -### Querying Array fields - -Djongo uses a mixture of Django query syntax and MongoDB query syntax. Consider a query to retrieve all entries made by the author *Paul*. Using `ManyToManyField` this requires 2 SQL queries. First selects the `id` for author Paul from the `author` table. Next, a JOIN with `entry_authors` and `entry` gives the corresponding entries. - -With `ArrayField` the query reduces to a single simple query: - -```python -entries = Entry.objects.filter(authors={'name': 'Paul'}) -``` - -Djongo lets you get even more specific with your queries. To query all entries where the *third author is Paul*: - -```python -entries = Entry.objects.filter(authors={'2.name': 'Paul'}) -``` -Note: In MongoDB the first element in the array starts at index 0. - -## Using ArrayField in Django Admin - -The official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) exemplifies 3 models that interact with each other: **Blog, Author and Entry**. This tutorial considers the same 3 models. The `blog`; `ForeignKey` of the `Entry` model was optimized in the [other tutorial](/djaosdb/using-django-with-mongodb-data-fields/), here we optimize the `authors`; `ManyToManyField`. - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def __str__(self): - return self.name - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateField() - mod_date = models.DateField() - authors = models.ManyToManyField(Author) - n_comments = models.IntegerField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - - def __str__(self): - return self.headline -``` - - A `ManyToManyField` defines a relation wherein *an entry is made by several authors*. It also defines a relation wherein *an author could have made several entries*. Django handles this internally by **creating another table**, the `entry_authors` table which contains different mappings between `entry_id` and `author_id`. - -Fetching an entry will require 2 SQL queries. The second query will be an expensive JOIN query across `entry_authors` and `authors`. The Model described above will work perfectly well on MongoDB as well, when you use Djongo as the connector. MongoDB however offers much more powerful ways to make such queries. These queries come at the cost of higher disk space utilization. - -As a designer using Djongo, you have the freedom to continue with the above schema. Alternatively, you can define a schema having a trade off on disk space for higher performance. - -Let us redefine the `authors` in the `Entry` models using the `ArrayField`: - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class MetaData(models.Model): - pub_date = models.DateField() - mod_date = models.DateField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - - class Meta: - abstract = True - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - class Meta: - abstract = True - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - ) - meta_data = models.EmbeddedField( - model_container=MetaData, - ) - - headline = models.CharField(max_length=255) - body_text = models.TextField() - - authors = models.ArrayField( - model_container=Author, - ) - n_comments = models.IntegerField() - - def __str__(self): - return self.headline - -``` - -**Notice** how the `ManyToManyField` is now replaced by the `ArrayField`. To display the Array field in Django Admin, a `Form` for the field must be present. Since the array is made up of abstract `Author` models, the form can be easily created by using a `ModelForm`. If you do not specify a `ModelForm` for your array models in the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. - - - -> Django Admin reveals multiple neatly nested `Name` and `Email` fields under a single Author label. - -Retrieving an entry from the database will result in **no JOINS and only a single database lookup. It is super fast** - - - - - diff --git a/docs/docs/fields/using-django-with-mongodb-array-reference-field.md b/docs/docs/fields/using-django-with-mongodb-array-reference-field.md deleted file mode 100644 index 815f62c589c6865122a87e9bdd2d8e16b8d4c10f..0000000000000000000000000000000000000000 --- a/docs/docs/fields/using-django-with-mongodb-array-reference-field.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Using Djongo Array Reference Field -permalink: /using-django-with-mongodb-array-reference-field/ ---- - -## Array Reference field - -The `ArrayField` stores embedded models within a MongoDB array as embedded documents for each entry. However, if entries contain duplicate embedded documents, using the `ArrayField` would result in unnecessary duplication and increased disk space usage. On the other hand, the Django `ManyToManyField` only refers to a different table of entries. In addition however, it creates an intermediate "through/join" table which records all the mappings. - -The `ArrayReferenceField` is one of the most powerful features of Djongo. The `ArrayReferenceField` is a bargain between the `ArrayField` and `ManyToManyField`. Similar to the `ManyToManyField` a separate collection is used for storing duplicate entries (instead of embedding them as an array). This means there is no data duplication. However, the intermediate "through/join" mapping table is completely skipped! This is achieved by storing only a reference to the entries in the embedded array. - -While the `ManyToManyField` required two queries to fetch data, the `ArrayReferenceField` requires just one query and is much faster. If you have used the `ManyToManyField`, then you know how to use the `ArrayReferenceField`. In fact, **it implements the exact same API** as the `ManyToManyField`. You can replace all existing `ManyToManyField` with `ArrayReferenceField` and everything will continue to work as is. - -In the example the `Entry` Model can be rewritten as follows: - -```python -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - model_form_class=BlogForm - ) - meta_data = models.EmbeddedField( - model_container=MetaData, - model_form_class=MetaDataForm - ) - - headline = models.CharField(max_length=255) - body_text = models.TextField() - - authors = models.ArrayReferenceField( - to=Author, - on_delete=models.CASCADE, - ) - n_comments = models.IntegerField() - - def __str__(self): - return self.headline - -``` -**Notice** how the `Author` model is no longer set as `abstract`. This means a separate `author` collection will be created in the DB. Simply set the `authors` to a list containing several author instances. When the entry gets saved, only a reference to the primary_key of the author model is saved in the array. Upon retrieving an entry from the DB the corresponding authors are automatically looked up and the author list is populated. - - The `ArrayReferenceField` behaves exactly like the `ManyToManyField`. However, underneath only references to the entries are being stored in the array. - -## ArrayReferenceField - -```python -class ArrayReferenceField(ForeignKey): - def __init__(self, *args, **kwargs): -``` -### Arguments - -Same as the `ForeignKey` Base class \ No newline at end of file diff --git a/docs/docs/fields/using-django-with-mongodb-data-fields.md b/docs/docs/fields/using-django-with-mongodb-data-fields.md deleted file mode 100644 index 61a20efbb3d06f5231d772b020859c7bf48b5f33..0000000000000000000000000000000000000000 --- a/docs/docs/fields/using-django-with-mongodb-data-fields.md +++ /dev/null @@ -1,409 +0,0 @@ ---- -title: Using Djongo Model fields -permalink: /using-django-with-mongodb-data-fields/ ---- - -## EmbeddedField - -MongoDB allows the creation of an [embedded document](https://docs.mongodb.com/manual/core/data-model-design/#data-modeling-embedding). By using Djongo as your connector, you can embed any other 'model' into your parent model through the `EmbeddedField`. - -```python -class EmbeddedField(MongoField): - def __init__(self, - model_container: typing.Type[Model], - model_form_class: typing.Type[forms.ModelForm] = None, - model_form_kwargs: dict = None, - *args, **kwargs): -``` - -### Arguments - -Argument | Type | Description ----------|------|------------- -`model_container`| `models.Model` | The child model class type (not instance) that this embedded field will contain. -`model_form_class` | `models.forms.ModelForm` | The child model form class type of the embedded model. -`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class Entry(models.Model): - _id = models.ObjectIdField() - blog = models.EmbeddedField( - model_container=Blog - ) - - headline = models.CharField(max_length=255) - objects = models.DjongoManager() - -e = Entry.objects.create( - headline='h1', - blog={ - 'name': 'b1', - 'tagline': 't1' - }) - -g = Entry.objects.get(headline='h1') -assert e == g - -e = Entry() -e.blog = { - 'name': 'b2' - 'tagline': 't2' -} -e.headline = 'h2' -e.save() - -``` - -## Field data integrity checks - -Djongo automatically validates the value assigned to an EmbeddedField. Integrity criteria (`null=True` or `blank=False`) can be applied on the `ÈmbeddedField` or to the internal fields (`CharField`) - -```python -class Entry(models.Model): - _id = models.ObjectIdField() - blog = models.EmbeddedField( - model_container=Blog, - null=True - ) - - headline = models.CharField(max_length=255) - objects = models.DjongoManager() - -e = Entry(headline='h1', blog=None) -e.clean_fields() - ->>> -# No validation error -``` - -```python -class Entry(models.Model): - _id = models.ObjectIdField() - blog = models.EmbeddedField( - model_container=Blog, - null=False - ) - - headline = models.CharField(max_length=255) - objects = models.DjongoManager() - -e = Entry(headline='h1', blog=None) -e.clean_fields() - ->>> - ValidationError({'blog': ['This field cannot be null.']}) -``` - -## Nesting Embedded Fields - -An `EmbeddedField` or `ArrayField` can be nested inside an `EmbeddedField`. There is no limitation on the depth of nesting. - -```python -from djaosdb import models - -class Tagline(models.Model) - title = models.CharField(max_length=100) - subtitle = models.CharField(max_length=100) - - class Meta: - abstract = True - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.EmbeddedField(model_container=Tagline) - - class Meta: - abstract = True - -class Entry(models.Model): - _id = models.ObjectIdField() - blog = models.EmbeddedField( - model_container=Blog - ) - - headline = models.CharField(max_length=255) - objects = models.DjongoManager() - -e = Entry.objects.create( - headline='h1', - blog={ - 'name': 'b1', - 'tagline': { - 'title': 'Tagline Title' - 'subtitle': 'Tagline Subtitle' - } - }) - -g = Entry.objects.get(headline='h1') -assert e == g - -``` - - -## Embedded Form - -While creating a Form for [the ModelForm](https://docs.djangoproject.com/en/dev/topics/forms/modelforms/), the embedded forms **are automatically generated**. Multiple embedded forms get automatically generated when the Model contains an array of embedded models. However, you can still override this by specifying the `model_form_class` argument in the `EmbeddedField`. - - -```python -from djaosdb import models -from django import forms - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class BlogForm(forms.ModelForm): - class Meta: - model = Blog - fields = ( - 'name', 'tagline' - ) - - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - model_form_class=BlogForm - ) - - headline = models.CharField(max_length=255) - objects = models.DjongoManager() -``` - -## Querying Embedded fields - -To query all BlogPost with content made by authors whose name startswith *Beatles* use the following query: - -```python -entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) -``` - -Internally Djongo converts this query (for BlogPost collection) to the form: - -```python -filter = { - 'blog.name': { - '$regex': '^Beatles.*$' - } -} -``` -For querying nested embedded fields provide the appropriate dictionary value - -```python -entries = Entry.objects.filter(blog__startswith={'tagline': {'subtitle': 'Artist'}) -``` -Internally Djongo converts this query (for BlogPost collection) to the form: - -```python -filter = { - 'blog.tagline.subtitle': { - '$regex': '^Artist.*$' - } -} -``` - -## Using EmbeddedField in Django Admin - -Django Admin is a powerful tool for managing data used in an app. When the models use Djongo relational fields, NoSQL "embedded models" can be created directly from Django Admin. **These fields provide better performance when compared with traditional Django relational fields.** - -Django admin can use models to automatically build a site area that can be used to create, view, update, and delete records. This can save a lot of time during development, making it very easy to test the models and get a feel for the right data. Django Admin is already quite well known, but to demonstrate how to use it with Djongo, here is a simple example. - -First define our basic models. In these tutorials, the same example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) is used. The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def __str__(self): - return self.name - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateField() - mod_date = models.DateField() - authors = models.ManyToManyField(Author) - n_comments = models.IntegerField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - - def __str__(self): - return self.headline -``` - -Start with the admin development by *registering* a model. Register the models defined above in the `admin.py` file. - -```python -from django.contrib import admin -from .models import Blog, Author, Entry - -admin.site.register([Blog, Author, Entry]) -``` - -## Data Model - -The `Entry` model defined in the documentation consists of 3 parts: -* 1-to-Many Relationship: A `Blog` is made up of multiple `Entry`s’ and each `Entry` is associated with just *one* `Blog`. The same entry cannot appear in two `Blog`s’ and this defines the 1-to-Many relationship. -* Many-to-Many Relationship: An `Entry` can have *multiple* `Author`s’ and an `Author` can make multiple `Entry`s’. This defines the many-to-many relationship for our data model. -* Normal data columns. - -**An interesting point of note** is that the `Blog` model consists of just 2 fields. Most of the data is stored in the `Entry` model. - -So what happens when a user enters a blog? The user wants to view the ‘Beatles blog’. In the project you could probably do: - -```python -blog = Blog.objects.get(name='Beatles Blog') -``` - -Next, to retrieve all entries related to the Beatles blog, follow it up with: - -```python -entries = Entry.objects.filter(blog_id=blog.id) -``` - -While it is fine to obtain entries in this fashion, you end up **making 2 trips** to the database. For SQL based backend this is not the most efficient way. The number of trips can be reduced to one. Django makes the query more efficient: - -```python -entries = Entry.objects.filter(blog__name='Beatles Blog') -``` - -This query will hit the database just once. All entries associated with a `Blog` having the name ‘Beatles Blog’ will be retrieved. However, this query generates a SQL JOIN. **JOINs are much slower when compared to single table lookups**. - -Since a `Blog` model shares a 1-to-many relationship with `Entry` the `Entry` model can be written as: - -```python -class Entry(models.Model): - blog_name = models.CharField(max_length=100) - blog_tagline = models.TextField() - headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateField() - mod_date = models.DateField() - authors = models.ManyToManyField(Author) - n_comments = models.IntegerField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - - def __str__(self): - return self.headline -``` - -The `Blog` fields have been inserted into the `Entry` model. With this new data model the query changes to: - -```python -entries = Entry.objects.filter(blog_name='Beatles Blog') -``` - -There are no JOINs generated with this and queries will be much faster. There is data duplication, but only if the backend database does not use data compression. - -Using compression to mitigate data duplication is fine but take a look at the Entry model, it has 10 columns and is getting unmanageable. - -## The Embedded Data Model - -A `Blog` contains a `name` and a `tagline`. An `Entry` contains details of the `Blog`, the `Authors`, `body_text` and some `Meta` data. To make the `Entry` model manageable it can be redefined with an `EmbeddedField`. - -Embedded data models should be used when it does not make sense to store a data set as another table in the database and refer to it every time with a foreign key lookup. However, you still want to group the data set in a hierarchical fashion, to isolate its functionality. - -In case you don't plan on using your embedded model as a standalone model (which means it will always be embedded inside a parent model) you should add the `class Meta` and `abstract = True` This way Djongo will never register this model as an [actual model](https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes). - -It is a good practice to **define embedded models as abstract models** and this is **strongly recommended**. - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - class Meta: - abstract = True - -class MetaData(models.Model): - pub_date = models.DateField() - mod_date = models.DateField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - - class Meta: - abstract = True - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog, - ) - meta_data = models.EmbeddedField( - model_container=MetaData, - ) - - headline = models.CharField(max_length=255) - body_text = models.TextField() - authors = models.ManyToManyField(Author) - n_comments = models.IntegerField() - - def __str__(self): - return self.headline -``` - -To display the embedded models in Django Admin, a `Form` for the embedded fields is required. Since the embedded field is an abstract model, the form is easily created by using a `ModelForm`. The `BlogForm` defines `Blog` as the model with `name` and `tagline` as the form fields. - -If you do not specify a `ModelForm` for your embedded models, and pass it using the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. - -Register the new models in `admin.py`. - -```python -from django.contrib import admin -from .embedded_models import Author, Entry - -admin.site.register([Author, Entry]) -``` - -The number of fields in the `Entry` model is reduce to 6. Fire up Django Admin to check what is up! - - - -Only the `Entry` and `Author` model are registered. I click on *Entrys Add* and get: - - - - -> The `Name` and `Tagline` fields are neatly nested within Blog. `Pub date` `Mod date` `N pingbanks` and `Rating` are neatly nested within Meta data. - -When a user queries for a blog named ‘Beatles Blog’, the query for filtering an embedded model changes to: - -```python -entries = Entry.objects.filter(blog={'name': 'Beatles Blog'}) -``` - -This query will return all entries having an embedded blog with the name ‘Beatles Blog’. **The query will hit the database just once and there are no JOINs involved.** - diff --git a/docs/docs/fields/using-django-with-other-fields.md b/docs/docs/fields/using-django-with-other-fields.md deleted file mode 100644 index f78d81664fe18559fc37f3ff5a04bffd2d34d488..0000000000000000000000000000000000000000 --- a/docs/docs/fields/using-django-with-other-fields.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Other fields -permalink: /using-django-with-other-fields/ ---- - -## The ObjectId Field - -For every document inserted into a collection MongoDB internally creates an [ObjectID](https://docs.mongodb.com/manual/reference/method/ObjectId/) field with the name `_id`. Reference this field from within the Model: - -```python -class Entry(models.Model): - _id = models.ObjectIdField() - blog = models.EmbeddedField( - model_container=Blog, - ) -``` - -By default the `ObjectIdField` internally sets `primary_key` as `True`. This means the implicitly created `id` AUTOINCREMENT field will not be created. The Field inherits from the `AutoField`. An ObjectID will be automatically generated by MongoDB for every document inserted. - -Consider using the `ObjectIdField` in your models if you want to avoid calling Django migrations every time you create a new model. - -## ObjectIdField - -```python -class ObjectIdField(Field): - def __init__(self, *args, **kwargs): -``` - -### Arguments - -Same as the `Field` Base class - -## The List field - -> Note: To be depreciated soon and replaced with a `JSONField` - -`ArrayField` and `ArrayReferenceField` require all Models in the list to be of the same type. MongoDB allows the saving of arbitrary data inside it is embedded array. The `ListField` is useful in such cases. The list field cannot be represented in Django Admin though and can only be used in the python script. - -### ListField - -```python -class ListField(Field): - def __init__(self, *args, **kwargs): -``` - -### Arguments - -Same as the `Field` Base class \ No newline at end of file diff --git a/docs/docs/get-started.md b/docs/docs/get-started.md deleted file mode 100644 index 91dd09c4c5802b91f10b80ec06920a6832949869..0000000000000000000000000000000000000000 --- a/docs/docs/get-started.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -title: Integrating Django with MongoDB -permalink: /get-started/ -redirect_from: /integrating-django-with-mongodb/ -description: "Djongo is a python connector for using the Django ORM with MongoDB. Use MongoDB as a backend database for your Django project, without changing the Django ORM. Start using Django with MongoDB by adding just one line of code" ---- - -{{ page.notice.sponsor }} - -Use MongoDB as a backend database for your Django project, without changing the Django ORM. Use Django Admin to add and modify documents in MongoDB. Start using Django with MongoDB by adding just one line of code. - -## Usage -1. pip install djaosdb -2. Into `settings.py` file of your project, add: - - ```python - DATABASES = { - 'default': { - 'ENGINE': 'djaosdb', - 'NAME': 'your-db-name', - } - } - ``` - -3. YOU ARE SET! Have fun! - -## Requirements -1. Python 3.6 or higher. -2. MongoDB 3.4 or higher. -3. If your models use nested queries or sub querysets like: - - ```python - inner_query = Blog.objects.filter(name__contains='Ch').values('name') - entries = Entry.objects.filter(blog__name__in=inner_query) - ``` - MongoDB 3.6 or higher is required. - -## Support -<!-- -[][sponsor_page] ---> - -I am inundated daily with your appreciation, queries and feature requests for Djongo. Djongo has grown into a highly complex project. To support the requests, I have decided to follow an organized approach. - -Djongo as a project is at a stage where its development must be transformed into a sustained effort. Djongo has more than [1,000,000 downloads](https://pypistats.org/packages/djaosdb) on pypi and continues to grow. I am trying to establish a sustainable development model for the project, and would [love to hear your thoughts.](https://www.patreon.com/posts/to-only-take-22611438) - -Visit my [Patreon page][sponsor_page] to make requests and for support. You can expect immediate answers to your questions. - -## How it works -Djongo makes **zero changes** to the existing Django ORM framework, which means unnecessary bugs and security vulnerabilities do not crop up. It simply translates a SQL query string into a [MongoDB query document](https://docs.mongodb.com/manual/tutorial/query-documents/). As a result, all Django features, models, etc., work as is. - -Django contrib modules: - -```python -'django.contrib.admin', -'django.contrib.auth', -'django.contrib.sessions', -``` -and others... fully supported. - -## What you get -Djongo ensures that you: - - * Reuse Django Models/ORM. - * Work with the original Django variant. - * Future proof your code. - * Atomic SQL JOIN operations. - -Get [expert support][sponsor_page] for complex projects. - -## Rapid Prototyping -Djongo lets you rapidly develop and evolve your app models. Modifying your models is **much faster** with Djongo compared to traditional Django ORM. Since MongoDB is a schema-less database, every time you redefine a model, MongoDB does not expect you to redefine the schema. - -### Goodbye Migrations -With Djongo you **permanently say goodbye** to Django Migrations. To enable migration free model evolution simply set `ENFORCE_SCHEMA: False` in your database configuration. Djongo no longer interprets SQL DDL statements (example CREATE TABLE) to emit caosdb `create_collection` commands. With `ENFORCE_SCHEMA: False` collections are created implicitly, on the fly. - -## Security and Integrity Checks -Djongo allows for checks on data fields before they are saved to the database. Running the correct integrity checks and field value validators before writing data into the database is important. - - -### Validators -Apply validators to each field before they are saved. - -```python -from django.core.exceptions import ValidationError -from django.utils.translation import gettext_lazy as _ -from djaosdb import models -from django.core.validators import URLValidator - -def script_injection(value): - if value.find('<script>') != -1: - raise ValidationError(_('Script injection in %(value)s'), - params={'value': value}) - -class Address(models.Model) - city = models.CharField(max_length=50) - homepage = models.URLField(validators=[URLValidator, script_injection]) - class Meta: - abstract=True - -class Entry(models.Model): - _id = models.ObjectIdField() - address = models.EmbeddedField(model_container=Address) -``` - -### Integrity checks - -```python -class Entry(models.Model): - _id = models.ObjectIdField() - address = models.EmbeddedField(model_container=Address, - null=False, - blank=False) -``` - -By setting `null=False, blank=False` in `EmbeddedField`, missing values are never stored. - -<!-- -## Structured Data vs Flexibility ---> - -## Using MongoDB Fields - -### EmbeddedField - Nest a `dict` inside a model with the `EmbeddedField`. The `model_container` is used to describe the structure of the - data being stored. - -```python -from djaosdb import models - -class Blog(models.Model): - name = models.CharField(max_length=100) - - class Meta: - abstract = True - -class Entry(models.Model): - blog = models.EmbeddedField( - model_container=Blog - ) - headline = models.CharField(max_length=255) - -e = Entry() -e.blog = { - 'name': 'Djongo' -} -e.headline = 'The Django MongoDB connector' -e.save() -``` - -### ArrayField -Nest a `list` of `dict` inside a model for more complex data. - -```python -from djaosdb import models - -class Entry(models.Model): - blog = models.ArrayField( - model_container=Blog - ) - headline = models.CharField(max_length=255) - -e = Entry() -e.blog = [ - {'name': 'Djongo'}, {'name': 'Django'}, {'name': 'MongoDB'} -] -e.headline = 'Djongo is the best Django and MongoDB connector' -e.save() -``` -<!-- -### JSONField - - -## Simplify complex queries - -## Django Admin - ---> - -## DjongoNxt - -Features under development at DjongoNxt are not a part of the standard Djongo package. Visit the [sponsors page][sponsor_page] for more information. -{: .notice--info} - -DjongoNxt is a Django and MongoDB connector for full featured database usage. It provides many features of MongoDB enabled through Django. It comes with support for: - -### Indexes - -Support for all indexes provided by MongoDB, for example 2dSphere Index, Text Index and Compound Indexes. - -### Model Query - -Support for GeoSpatial Queries and Tailable Cursors. - -### Model Update - -Unordered and Ordered Bulk Writes. - -### Database Transactions - -Atomic multi document transactions with commit and rollback support. - -### Schema Validation and Model Creation - -Automatic JSON Schema validation document generation and options to add Read and Write Concerns for the Models. - -### Aggregation Operators - -Support for various aggregation operators provided by MongoDB. - -## Contribute - -If you think djaosdb is useful, **please share it** with the world! Your endorsements and online reviews will help get more support for this project. - -You can contribute to the source code or the documentation by creating a simple pull request! You may want to refer to the design documentation to get an idea on how [Django MongoDB connector](/djaosdb/django-mongodb-connector-design-document/) is implemented. - -Please contribute to the continued development and success of Djongo by [making a donation][sponsor_page]. - -{% include links %} diff --git a/docs/docs/home.md b/docs/docs/home.md deleted file mode 100644 index 52129345738ff1b4091af991e65be4bb78a2b461..0000000000000000000000000000000000000000 --- a/docs/docs/home.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -permalink: / -layout: splash -title: "Django MongoDB connector" -excerpt: -description: "Djongo is a python connector for using the Django ORM with MongoDB. Use Django Admin to directly add and modify documents stored in MongoDB. Use other contrib modules such as Auth and Sessions without any changes" - -header: - overlay_image: /assets/images/landing-banner3.jpg - -punchline: - - excerpt: A python Object Document Mapper (ODM) that let's you use Django with MongoDB *without* changing the Django ORM. - -feature_row1: - - image_path: /assets/images/django.jpg - alt: "Security" - title: "Security" - excerpt: "Since there are **zero modifications** to the Django source code, - you get complete security and reliability of Django." - - - image_path: /assets/images/mongo.jpg - alt: "Unleash MongoDB on Django" - title: "Unleash MongoDB" - excerpt: "Create MongoDB [embedded documents,](/djaosdb/using-django-with-mongodb-data-fields/) - [embedded arrays](/djaosdb/using-django-with-mongodb-array-field/) in Django Models, - [MongoDB specific indexes](/djaosdb/djaosdbnxt-indexes/) and [transactions.](djaosdbnxt-database-transactions/)" - - - image_path: /assets/images/feature-admin-mongo.jpg - alt: "Admin MongoDB" - title: "Use Django Admin" - excerpt: "Use Django Admin GUI to insert, modify and delete documents in MongoDB." - - - image_path: /assets/images/support.png - alt: "Support" - title: "Support" - excerpt: "Get immediate support for queries on using Django with MongoDB." - url: https://nesdis.github.io/djaosdb/sponsor/ - btn_label: "Learn More" - btn_class: "btn--primary" - - - image_path: /assets/images/djaosdb-symbol2.jpg - alt: "Admin MongoDB" - title: "Rapid App Development" - excerpt: "Speed up app development and execution with [schema free models](/djaosdb/get-started/#enforce-schema), - skip migrations, autogenerate [complex queries.](/djaosdb/using-django-with-mongodb-array-reference-field/)" - - - image_path: /assets/images/drf.jpg - alt: "Admin MongoDB" - title: "Third Party Support" - excerpt: "Extra goodies that help interface MongoDB with Django Rest Framework." - -addendum_row1: - - image_path: /assets/images/djaosdb-Nxt-v1.png - alt: "Djongo Next" - title: "Djongo Next" - excerpt: "The next generation connector. Ships with binary extensions for professional usage." - url: https://nesdis.github.io/djaosdb/sponsor/ - btn_label: "Learn More" - btn_class: "btn--primary" - -advert_row: - - image_path: /assets/images/e2e.png - alt: "Admin MongoDB" - image_link: http://www.e2eprojects.com/ - - - image_path: /assets/images/white.jpg - alt: "Admin MongoDB" - - - image_path: /assets/images/sumeru.png - alt: "Admin MongoDB" - image_link: https://www.sumerusolutions.com/ - ---- - -{% include feature_row id="punchline" type="center" %} - -<!-- -{% include advert_row %} ---> -{% include feature_row id="feature_row1" %} - -{% include feature_row id="addendum_row1" type="center" %} - - - - - diff --git a/docs/docs/sponsor.md b/docs/docs/sponsor.md deleted file mode 100644 index 119a1bf41c787f0fd19705546862c6536b84bcc6..0000000000000000000000000000000000000000 --- a/docs/docs/sponsor.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Sponsor -permalink: /sponsor/ -layout: splash - -excerpt: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support and advertisement space" -description: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support and advertisement space." - -tires: - - title: A Sweet Tip - price: 3 - btn_id: price_3 - price_id: price_1HIKfSLbyDBUaJVjuc3i3YEW - benefits: - - You use Djongo and you LOVE IT. - - You want to tip the project! Thanks! - - - title: Q&A - price: 4 - btn_id: price_4 - price_id: price_1HIKi6LbyDBUaJVj7FvgB3gx - benefits: - - Your questions are answered as soon as possible. - - You support the long term sustainability of the project. - - - title: Generous Supporter - price: 7 - btn_id: price_7 - price_id: price_1HIKkyLbyDBUaJVj8XbaHS8O - benefits: - - Your questions are answered within 24 hours. - - Your name is mentioned in the source code. - - You support the long term sustainability of the project. - - - title: Evangelist Supporter - price: 15 - btn_id: price_15 - price_id: price_1HIKphLbyDBUaJVjQylkb7QE - benefits: - - You **get access to the djaosdbNxt** repository. - - Your questions are **immediately** taken up for consideration as priority-support. - - You support the long term sustainability of the project. - - - title: Advertise on Djongo - price: 50 - btn_id: price_50 - price_id: price_1HHwbOLbyDBUaJVjYnDESotB - benefits: - - Your name or company logo will be displayed on the home page. - - Your feature requests and support queries to be given top priority. - -disclaimer: - - Subscriptions are not binding and can be canceled any time. - - Upon successful checkout you are provided with an option to submit additional details required to deliver your benefits. - ---- - -{% include empty_banner %} - -{% include tire_column %} - -{% include vendors/stripe.html %} diff --git a/docs/docs/support.md b/docs/docs/support.md deleted file mode 100644 index 40e57fed6b1b0fd67c5bea8d871cf704bebb60a7..0000000000000000000000000000000000000000 --- a/docs/docs/support.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Support -permalink: -layout: splash - -row1: - - image_path: /assets/images/migration.png - alt: "Migration Support" - title: "Migration Support" - excerpt: "Migrate your existing Django app to MongoDB in a phased manner." - -row2: - - image_path: /assets/images/optimization2.png - alt: "Database Optimization" - title: "Database Optimization" - excerpt: "Migrate Django Fields to powerful Djongo Fields in a phased manner and notice the difference." - -row3: - - image_path: /assets/images/bug.jpg - alt: "Debug Support" - title: "Development and Debug Support" - excerpt: "Support for Django App development. Data model design and development." - -test1: - - excerpt: ">Thanks again for the quick responses! Great work by the way! --- Chan" - -test2: - - excerpt: ">Works like a charm. Thanks a lot. --- Theo" - -test3: - - excerpt: ">Thanks for you work on this. Thanks so much for your help and for Djongo. --- Ryan" - -test4: - - excerpt: ">I have to say Djongo is very useful between Django and Mongodb.--- Feng" - ---- - - - -{% include feature_row id="row1" type="left" %} - -{% include feature_row id="row2" type="right" %} - -{% include feature_row id="row3" type="left" %} - -<div class="feature__wrapper"> - -<div class="liquid-slider" id="slider-1"> - <div> - <h2 class="title">Chan</h2> - <p>Thanks again for the quick responses! Great work by the way!</p> - </div> - <div> - <h2 class="title">Theo</h2> - <p>Works like a charm. Thanks a lot.</p> - </div> - <div> - <h2 class="title">Ryan</h2> - <p>Thanks for you work on this. Thanks so much for your help and for Djongo.</p> - </div> - <div> - <h2 class="title">Feng</h2> - <p>I have to say Djongo is very useful between Django and Mongodb.</p> - </div> -</div> -</div> - -<form action="https://formspree.io/nesdis@gmail.com" - method="POST"> - Name: - <input type="text" name="Name" required> - Organization: - <input type="text" name="Organization" required> - Email: - <input type="email" name="_replyto" required> - Support Request: - <TEXTAREA Name="Message" rows="4" cols="20"></TEXTAREA> - <input type="submit" value="Send"> -</form> \ No newline at end of file diff --git a/docs/docs/using-django-with-mongodb-gridfs.md b/docs/docs/using-django-with-mongodb-gridfs.md deleted file mode 100644 index 18d9c51c00a4c109613e02da96ebaab1f52725b5..0000000000000000000000000000000000000000 --- a/docs/docs/using-django-with-mongodb-gridfs.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Using GridFSStorage -permalink: /using-django-with-mongodb-gridfs/ ---- - -[GridFS](https://docs.mongodb.com/manual/core/gridfs/) is a specification for storing and retrieving files that exceed the [BSON-document](https://docs.mongodb.com/manual/reference/glossary/#term-bson) [size limit](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) of 16 MB. - -GridFSStorage backend for Djongo aims to add a GridFS storage to upload files to using Django's file fields. - -We first define our basic models. In the tutorials, we use the example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/). The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. - -```python -## models.py -from djaosdb import models - - -class Blog(models.Model): - name = models.CharField(max_length=100) - tagline = models.TextField() - - def __str__(self): - return self.name - -class Author(models.Model): - name = models.CharField(max_length=200) - email = models.EmailField() - avatar = models.ImageField(upload_to='authors') - - def __str__(self): - return self.name - -class Entry(models.Model): - blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - headline = models.CharField(max_length=255) - body_text = models.TextField() - pub_date = models.DateField() - mod_date = models.DateField() - authors = models.ManyToManyField(Author) - n_comments = models.IntegerField() - n_pingbacks = models.IntegerField() - rating = models.IntegerField() - featured_image = models.ImageField(upload_to='entries') - - def __str__(self): - return self.headline -``` - -### GridFS Storage - -The `Author` and `Entry` models define a field type `ImageField`. Until now, when you upload files, those files will be uploaded to `MEDIA_ROOT/authors` and `MEDIA_ROOT/entries` directories. - -So, what happens if you want to save those files into database? That is when appears GridFS to the rescue!. - -In your `models.py` file you could probably do: - -```python -## models.py -from django.conf import settings - -# Add the import for GridFSStorage -from djaosdb.storage import GridFSStorage - - -# Define your GrifFSStorage instance -grid_fs_storage = GridFSStorage(collection='myfiles', base_url=''.join([settings.BASE_URL, 'myfiles/'])) -``` - -In `Author` change `avatar` field definition for this: - -```python -avatar = models.ImageField(upload_to='authors', storage=grid_fs_storage) -``` - -In `Entry` change `avatar` field definition for this: - -```python -featured_image = models.ImageField(upload_to='entries', storage=grid_fs_storage) -``` - -And, that's all, when you upload `avatar` for `Author` it will be saved in collection `myfiles.authors.files` or when you upload `featured_image` for `Entry` it will be saved in collection `myfiles.entries.files` - - -### Retriving values - -Suppose that you have saved some documents in your collection related to Author model, so if you want to retrieve one of them, you could probably do: - -``` -# in a python console ->>> author = Author.object.get(id=1) ->>> print(author) -{ 'id': 1, 'name': 'Lisa Stoner', 'email': 'lisa.stoner@nomail.local', 'avatar': 'http://mysite.local/myfiles/5dc880e06a8e6a7effa592a7'} -``` - -As you can see, the value that is retrieved in `avatar` field is the `_id` related to the saved image|file. In this case you get a url because you probably have in your settings file the following: -```python -UPLOADED_FILES_USE_URL = True -``` \ No newline at end of file diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 858a74b7c1f0607e129289331152decacde831c5..0000000000000000000000000000000000000000 Binary files a/docs/favicon.ico and /dev/null differ diff --git a/docs/google1a570be6734e7664.html b/docs/google1a570be6734e7664.html deleted file mode 100644 index 810015cebf92f92a659fe8a5ac574b9bbfbf3244..0000000000000000000000000000000000000000 --- a/docs/google1a570be6734e7664.html +++ /dev/null @@ -1 +0,0 @@ -google-site-verification: google1a570be6734e7664.html \ No newline at end of file diff --git a/tests/djongo_tests/test_project/xtest_app/tests/__init__.py b/tests/djongo_tests/test_project/xtest_app/tests/__init__.py index 98790dda906c3547f15390a26ea4adc8cec3205e..f98fb8fb10564a391e1ae974b57406066e0a9746 100644 --- a/tests/djongo_tests/test_project/xtest_app/tests/__init__.py +++ b/tests/djongo_tests/test_project/xtest_app/tests/__init__.py @@ -3,20 +3,20 @@ from typing import Any from unittest.util import safe_repr from django.conf import settings -from caosdb import MongoClient -from caosdb.database import Database +from django.caosdb_client import CaosDBClient +# from caosdb.database import Database from djaosdb.models import Model from django.test import TestCase as DjangoTestCase from logging import getLogger, StreamHandler, DEBUG class TestCase(DjangoTestCase): - client: MongoClient - db: Database + client: CaosDBClient + db: str @classmethod def setUpClass(cls): - cls.client = MongoClient() + cls.client = CaosDBClient() db = settings.DATABASES['default']['NAME'] cls.db = cls.client[db] logger = getLogger(__name__) diff --git a/tests/mock_tests/test_sqlparsing.py b/tests/mock_tests/test_sqlparsing.py index c698047ef64d570aff01f3a09da9b6201678add5..bd6222337f9c5c452fb22a5c9d98ba9bbe8995b7 100644 --- a/tests/mock_tests/test_sqlparsing.py +++ b/tests/mock_tests/test_sqlparsing.py @@ -4,11 +4,11 @@ from logging import getLogger, DEBUG, StreamHandler from unittest import TestCase, mock, skip from unittest.mock import patch, MagicMock, call -from caosdb.command_cursor import CommandCursor -from caosdb.cursor import Cursor +# from caosdb.command_cursor import CommandCursor +# from caosdb.cursor import Cursor from djaosdb.base import DatabaseWrapper -from djaosdb.sql2mongo.query import Query +from djaosdb.sql2mongo.query import Query, BasicCursor as Cursor, CommandCursor sqls = [ 'UPDATE "auth_user" ' @@ -2355,7 +2355,7 @@ class TestDatabaseWrapper(TestCase): self.assertIs(params['port'], port) self.assertIs(params['host'], host) - @patch('djaosdb.database.MongoClient') + @patch('djaosdb.database.CaosDBClient') def test_connection(self, mocked_mongoclient): settings_dict = MagicMock(dict) wrapper = DatabaseWrapper(settings_dict) diff --git a/tests/precheckin.py b/tests/precheckin.py index c094590c6bdfb413844fd7ce0ad1011546df5586..166b5f4a7f0754a7d2b94e78e7e405ddd8f1e00e 100644 --- a/tests/precheckin.py +++ b/tests/precheckin.py @@ -5,10 +5,10 @@ import subprocess import sys import unittest -from caosdb import MongoClient +from djaosdb.caosdb_client import CaosDBClient from mock_tests import test_sqlparsing -client = MongoClient() +client = CaosDBClient() TEST_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -26,8 +26,8 @@ def run_test_sqlparsing(): def run_commands(path): - with client: - client.drop_database('djaosdb-test') + # with client: + # client.drop_database('djaosdb-test') manage_py = os.path.join(path, "manage.py") cmds = [ diff --git a/tox.ini b/tox.ini index 5e17be071b3b5758830d9f255ac899c9c534ce40..22c2aa5eeb6bab5e228b79af8af0520514b9ef37 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ [tox] envlist = - py{36,38}-django{21, _stable} + py{36,38}-django{21, 30, _stable, 22_run_test, 22_discover, 21_discover} [testenv]