Commit 81af85be by Joosep L

bug fixes/added features

parent 1a1e0835
<component name="InspectionProjectProfileManager">
<settings>
<option name="useProjectProfile" value="false" />
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.5.2+ (/usr/bin/python3.5)" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/thesis-backend.iml" filepath="$PROJECT_DIR$/.idea/thesis-backend.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="thesis/settings.py" />
<option name="manageScript" value="manage.py" />
<option name="environment" value="&lt;map/&gt;" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="15fd5188-1ca5-494a-88a5-1bae0ca63ef1" name="Default" comment="">
<change type="DELETED" beforePath="$PROJECT_DIR$/my_project.dot" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/my_project_subsystem.png" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/my_project_visualized.png" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api/models.py" afterPath="$PROJECT_DIR$/api/models.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api/serializers.py" afterPath="$PROJECT_DIR$/api/serializers.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api/urls.py" afterPath="$PROJECT_DIR$/api/urls.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/api/views.py" afterPath="$PROJECT_DIR$/api/views.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/thesis/settings.py" afterPath="$PROJECT_DIR$/thesis/settings.py" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="admin.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/admin.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="apps.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/apps.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="models.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1205">
<caret line="160" column="59" lean-forward="false" selection-start-line="160" selection-start-column="59" selection-end-line="160" selection-end-column="59" />
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="serializers.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/serializers.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1205">
<caret line="83" column="0" lean-forward="false" selection-start-line="83" selection-start-column="0" selection-end-line="83" selection-end-column="0" />
<folding>
<element signature="e#0#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="tests.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/tests.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="urls.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="26" column="0" lean-forward="false" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
<folding>
<element signature="e#0#41#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="views.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/api/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="7" column="38" lean-forward="false" selection-start-line="7" selection-start-column="38" selection-end-line="7" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="settings.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/thesis/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="26" column="17" lean-forward="false" selection-start-line="26" selection-start-column="17" selection-end-line="26" selection-end-column="17" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="manage.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/manage.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="urls.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/thesis/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/api/models.py" />
<option value="$PROJECT_DIR$/api/serializers.py" />
<option value="$PROJECT_DIR$/api/urls.py" />
<option value="$PROJECT_DIR$/api/views.py" />
<option value="$PROJECT_DIR$/thesis/settings.py" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds">
<option name="y" value="-21" />
<option name="width" value="2880" />
<option name="height" value="1641" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
<manualOrder />
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="thesis" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="static" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="admin" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="thesis-backend" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="api" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scratches" />
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="WebServerToolWindowFactoryState" value="false" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Django server.thesis-backend">
<configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="TARGET" value="" />
<option name="SETTINGS_FILE" value="" />
<option name="CUSTOM_SETTINGS" value="false" />
<option name="USE_OPTIONS" value="false" />
<option name="OPTIONS" value="" />
<method />
</configuration>
<configuration default="true" type="JavaScriptTestRunnerJest" factoryName="Jest">
<node-interpreter value="project" />
<working-dir value="" />
<envs />
<scope-kind value="ALL" />
<method />
</configuration>
<configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor">
<config-file value="" />
<node-interpreter value="project" />
<envs />
<method />
</configuration>
<configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
<method />
</configuration>
<configuration default="true" type="PyBehaveRunConfigurationType" factoryName="Behave">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="ADDITIONAL_ARGS" value="" />
<method />
</configuration>
<configuration default="true" type="PyLettuceRunConfigurationType" factoryName="Lettuce">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="ADDITIONAL_ARGS" value="" />
<method />
</configuration>
<configuration default="true" type="Python.DjangoServer" factoryName="Django server">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<option name="launchJavascriptDebuger" value="false" />
<option name="port" value="8000" />
<option name="host" value="" />
<option name="additionalOptions" value="" />
<option name="browserUrl" value="" />
<option name="runTestServer" value="false" />
<option name="runNoReload" value="false" />
<option name="useCustomRunCommand" value="false" />
<option name="customRunCommand" value="" />
<method />
</configuration>
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<method />
</configuration>
<configuration default="true" type="Tox" factoryName="Tox">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<module name="thesis-backend" />
<method />
</configuration>
<configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
<method />
</configuration>
<configuration default="true" type="js.build_tools.npm" factoryName="npm">
<command value="run" />
<scripts />
<node-interpreter value="project" />
<envs />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Doctests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Unittests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;.&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
<method />
</configuration>
<configuration default="false" name="thesis-backend" type="Python.DjangoServer" factoryName="Django server">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="thesis-backend" />
<option name="launchJavascriptDebuger" value="false" />
<option name="port" value="8000" />
<option name="host" value="" />
<option name="additionalOptions" value="" />
<option name="browserUrl" value="" />
<option name="runTestServer" value="false" />
<option name="runNoReload" value="false" />
<option name="useCustomRunCommand" value="false" />
<option name="customRunCommand" value="" />
<method />
</configuration>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="Django server.thesis-backend" />
</list>
</component>
<component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="15fd5188-1ca5-494a-88a5-1bae0ca63ef1" name="Default" comment="" />
<created>1496690444071</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1496690444071</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="0" y="-21" width="2880" height="1641" extended-state="6" />
<layout>
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.23761666" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Data View" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="processedProjectFiles" value="true" />
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/api/admin.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/apps.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1205">
<caret line="160" column="59" lean-forward="false" selection-start-line="160" selection-start-column="59" selection-end-line="160" selection-end-column="59" />
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/serializers.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1205">
<caret line="83" column="0" lean-forward="false" selection-start-line="83" selection-start-column="0" selection-end-line="83" selection-end-column="0" />
<folding>
<element signature="e#0#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/tests.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="26" column="0" lean-forward="false" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
<folding>
<element signature="e#0#41#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="7" column="38" lean-forward="false" selection-start-line="7" selection-start-column="38" selection-end-line="7" selection-end-column="38" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/thesis/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="26" column="17" lean-forward="false" selection-start-line="26" selection-start-column="17" selection-end-line="26" selection-end-column="17" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/manage.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/thesis/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</component>
</project>
\ No newline at end of file
...@@ -139,7 +139,7 @@ class Answer(models.Model): ...@@ -139,7 +139,7 @@ class Answer(models.Model):
point= models.ForeignKey(Point, on_delete=models.CASCADE) point= models.ForeignKey(Point, on_delete=models.CASCADE)
problem_type = models.ForeignKey(ProblemType, on_delete=models.CASCADE) problem_type = models.ForeignKey(ProblemType, on_delete=models.CASCADE)
given_answer = models.CharField(max_length=200, blank=True, null=True) given_answer = models.CharField(max_length=200, blank=True, null=True)
photo = models.FileField(upload_to='photos', blank=True, null=True) photo = models.ImageField(upload_to='photos', blank=True, null=True)
is_correct = models.BooleanField() is_correct = models.BooleanField()
updated_at = models.DateTimeField(blank=True, null=True) updated_at = models.DateTimeField(blank=True, null=True)
created_at = models.DateTimeField(default=datetime.now) created_at = models.DateTimeField(default=datetime.now)
......
...@@ -63,6 +63,8 @@ class PointSerializer(serializers.ModelSerializer): ...@@ -63,6 +63,8 @@ class PointSerializer(serializers.ModelSerializer):
class AnswerSerializer(serializers.ModelSerializer): class AnswerSerializer(serializers.ModelSerializer):
problem_type = ProblemTypeSerializer(many=False)
class Meta: class Meta:
model = Answer model = Answer
fields = ('id', 'user_game', 'point', 'problem_type', 'is_correct') fields = ('id', 'user_game', 'point', 'problem_type', 'is_correct')
...@@ -72,7 +74,7 @@ class AnswerSerializer(serializers.ModelSerializer): ...@@ -72,7 +74,7 @@ class AnswerSerializer(serializers.ModelSerializer):
class BoundSerializer(serializers.ModelSerializer): class BoundSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Bounds model = Bounds
fields = ('id', 'notification_text') fields = ('id', 'notification_text', 'mpoly')
class CheckInSerializer(serializers.ModelSerializer): class CheckInSerializer(serializers.ModelSerializer):
......
...@@ -8,17 +8,19 @@ router = routers.DefaultRouter() ...@@ -8,17 +8,19 @@ router = routers.DefaultRouter()
urlpatterns = [ urlpatterns = [
url(r'^', include(router.urls)), url(r'^', include(router.urls)),
url(r'login', views.UserViewSet.as_view()), url(r'user/login', views.login),
url(r'user/games', views.GetUsersGames.as_view()), url(r'user/games', views.GetUsersGames.as_view()),
url(r'user/add', views.PostUser.as_view()), url(r'user/add', views.PostUser.as_view()),
url(r'games', views.GetGame.as_view()), url(r'games', views.GetGame.as_view()),
url(r'game/start', views.StartGame), url(r'game/start', views.StartGame),
url(r'game/end', views.EndGame),
url(r'game/adduser', views.PostGameToUser), url(r'game/adduser', views.PostGameToUser),
url(r'game/points', views.GetPoints.as_view()), url(r'game/points', views.GetPoints.as_view()),
url(r'game/bounds', views.GetBounds.as_view()),
url(r'game/checkin', views.PostCheckIn), url(r'game/checkin', views.PostCheckIn),
url(r'game/addanswer', views.PostAnswer), url(r'game/addanswer', views.PostAnswer),
url(r'game/message', views.PostMessage), url(r'game/message', views.PostMessage),
url(r'game/stats', views.GetCheckIns), url(r'game/stats', views.GetCheckIns),
url(r'login', views.UserViewSet.as_view()),
] ]
from datetime import timezone
import requests
from django.http import JsonResponse, HttpResponse from django.http import JsonResponse, HttpResponse
from django.utils.timezone import localtime, now from django.utils.timezone import localtime, now
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
...@@ -7,6 +10,30 @@ from rest_framework.response import Response ...@@ -7,6 +10,30 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from api.serializers import * from api.serializers import *
import base64
from django.core.files.base import ContentFile
@api_view(['POST'])
def login(request):
try:
access_token = request.GET.get('access_token')
service = request.GET.get('service')
# vaata kas fb või goole
if(service == "fb"):
r = requests.get('https://graph.facebook.com/me?access_token=' + access_token)
id = r.json()['id']
try:
user = User.objects.get(service_uid=id)
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
except User.DoesNotExist:
user = User(service="fb", service_uid=id, username=r.json()['name'])
user.save()
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
except:
return HttpResponse(status=400)
class UserViewSet(APIView): class UserViewSet(APIView):
...@@ -29,6 +56,54 @@ class PostUser(APIView): ...@@ -29,6 +56,54 @@ class PostUser(APIView):
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET'])
def GetCheckIns(request):
try:
user_id = request.GET.get('user_id')
game_id = request.GET.get('game_id')
user_game = UserGame.objects.filter(user__id=user_id, game__id=game_id)
checkins = CheckIn.objects.filter(user_game=user_game[0])
json = []
for check in checkins:
serializer = CheckInSerializer(check)
json.append(serializer.data)
return JsonResponse(json, status=status.HTTP_200_OK, safe=False)
except:
return HttpResponse(status=400)
@api_view(['POST'])
def login(request):
try:
access_token = request.POST.get('access_token')
service = request.POST.get('service')
# vaata kas fb või goole
if(service == 'fb'):
r = requests.get('https://graph.facebook.com/me?access_token=' + access_token)
id = r.json()['id']
try:
user = User.objects.get(service_uid=id)
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
except User.DoesNotExist:
user = User(service="fb", service_uid=id, username=r.json()['name'])
user.save()
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
else:
r = requests.get('https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=' + access_token)
email = r.json()['email']
name = r.json()['name']
try:
user = User.objects.get(service_uid=email)
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
except User.DoesNotExist:
user = User(service="google", service_uid=email, username=name)
user.save()
return JsonResponse(user.id, status=status.HTTP_200_OK, safe=False)
except:
return HttpResponse(status=400)
# fields = ('username', 'service', 'service_uid', 'email', 'device_id')
@api_view(['POST']) @api_view(['POST'])
def PostGameToUser(request): def PostGameToUser(request):
try: try:
...@@ -37,14 +112,18 @@ def PostGameToUser(request): ...@@ -37,14 +112,18 @@ def PostGameToUser(request):
game = Game.objects.get(game_code=game_code) game = Game.objects.get(game_code=game_code)
user = User.objects.get(id=user_id) user = User.objects.get(id=user_id)
try:
user_game = UserGame.objects.get(user=user, game=game)
serializer = GameSerializer(game)
json = {'user_game_id': user_game.id, 'start_time': user_game.start_time, 'game': serializer.data}
return JsonResponse(json, status=status.HTTP_200_OK, safe=False)
except UserGame.DoesNotExist:
user_game = UserGame(user=user, game=game) user_game = UserGame(user=user, game=game)
user_game.save() user_game.save()
serializer = GameSerializer(game) serializer = GameSerializer(game)
json = {'user_game_id': user_game.id, 'game': serializer.data} json = {'user_game_id': user_game.id, 'game': serializer.data}
return JsonResponse(json, status=status.HTTP_201_CREATED, safe=False) return JsonResponse(json, status=status.HTTP_201_CREATED, safe=False)
return HttpResponse(status=201)
except: except:
return HttpResponse(status=400) return HttpResponse(status=400)
...@@ -61,6 +140,18 @@ def StartGame(request): ...@@ -61,6 +140,18 @@ def StartGame(request):
return HttpResponse(status=400) return HttpResponse(status=400)
@api_view(['POST'])
def EndGame(request):
try:
user_game_id = request.POST.get('user_game_id')
user_game = UserGame.objects.get(id=user_game_id)
user_game.end_time = localtime(now())
user_game.save()
return Response("success", status=status.HTTP_201_CREATED)
except:
return HttpResponse(status=400)
@api_view(['GET']) @api_view(['GET'])
def GetCheckIns(request): def GetCheckIns(request):
try: try:
...@@ -98,6 +189,13 @@ class GetPoints(generics.ListAPIView): ...@@ -98,6 +189,13 @@ class GetPoints(generics.ListAPIView):
filter_fields = ('game',) filter_fields = ('game',)
class GetBounds(generics.ListAPIView):
queryset = Bounds.objects.all()
serializer_class = BoundSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('game',)
@api_view(['POST']) @api_view(['POST'])
def PostAnswer(request): def PostAnswer(request):
try: try:
...@@ -107,6 +205,9 @@ def PostAnswer(request): ...@@ -107,6 +205,9 @@ def PostAnswer(request):
given_answer = request.POST.get('given_answer') given_answer = request.POST.get('given_answer')
is_correct = request.POST.get('is_correct') is_correct = request.POST.get('is_correct')
# photo = request.POST.get('photo')
# image_data = base64.b64decode(photo)
user_game = UserGame.objects.get(id=user_game_id) user_game = UserGame.objects.get(id=user_game_id)
point = Point.objects.get(id=point_id) point = Point.objects.get(id=point_id)
problem_type = ProblemType.objects.get(id=problem_type_id) problem_type = ProblemType.objects.get(id=problem_type_id)
...@@ -123,6 +224,8 @@ def PostAnswer(request): ...@@ -123,6 +224,8 @@ def PostAnswer(request):
@api_view(['POST']) @api_view(['POST'])
def PostMessage(request): def PostMessage(request):
try: try:
request.encoding = 'utf-8'
user_game_id = request.POST.get('user_game_id') user_game_id = request.POST.get('user_game_id')
user_id = request.POST.get('user_id') user_id = request.POST.get('user_id')
content = request.POST.get('content') content = request.POST.get('content')
...@@ -139,6 +242,7 @@ def PostMessage(request): ...@@ -139,6 +242,7 @@ def PostMessage(request):
@api_view(['POST']) @api_view(['POST'])
def PostCheckIn(request): def PostCheckIn(request):
try: try:
user_game_id = request.POST.get('user_game_id') user_game_id = request.POST.get('user_game_id')
lat = request.POST.get('lat') lat = request.POST.get('lat')
lon = request.POST.get('lon') lon = request.POST.get('lon')
...@@ -146,6 +250,20 @@ def PostCheckIn(request): ...@@ -146,6 +250,20 @@ def PostCheckIn(request):
latest_answer_id = request.POST.get('latest_answer_id') latest_answer_id = request.POST.get('latest_answer_id')
user_game = UserGame.objects.get(id=user_game_id) user_game = UserGame.objects.get(id=user_game_id)
# Check if duration is over
max_duration = user_game.game.max_duration
now = datetime.now(timezone.utc)
delta = now - user_game.start_time
difference = divmod(delta.days * 864000 + delta.seconds, 60)
game_over = 0
if difference[0] > max_duration:
game_over = 1
# Check if current_time >= end_time
if(user_game.game.end_time):
if(user_game.game.end_time < now):
game_over = 1
answer = None answer = None
point = Point.objects.get(id=current_point_id) point = Point.objects.get(id=current_point_id)
...@@ -153,21 +271,16 @@ def PostCheckIn(request): ...@@ -153,21 +271,16 @@ def PostCheckIn(request):
json = {} json = {}
json['messages'] = [] json['messages'] = []
json['bounds'] = [] json['bounds'] = []
json['isover'] = game_over
# Check if any answers have been updated
if latest_answer_id is not None:
answer = Answer.objects.get(id=latest_answer_id)
if answer.point == point:
if answer.problem_type.title == 'CAM':
if answer.updated_at is not None:
answer_serializer = AnswerSerializer(answer)
json['answer'] = answer_serializer.data
try: try:
previous_check_in = CheckIn.objects.filter(user_game=user_game).latest('created_at') previous_check_in = CheckIn.objects.filter(user_game=user_game).latest('created_at')
except: except:
previous_check_in = None previous_check_in = None
# Check if any answers have been updated
# Save new CheckIn # Save new CheckIn
check_in = CheckIn(user_game=user_game, current_point=point, latest_answer=answer, lat=lat, lon=lon) check_in = CheckIn(user_game=user_game, current_point=point, latest_answer=answer, lat=lat, lon=lon)
check_in.save() check_in.save()
...@@ -184,6 +297,17 @@ def PostCheckIn(request): ...@@ -184,6 +297,17 @@ def PostCheckIn(request):
message_serializer = MessageSerializer(mes) message_serializer = MessageSerializer(mes)
json['messages'].append(message_serializer.data) json['messages'].append(message_serializer.data)
if latest_answer_id is not None:
answers = Answer.objects.filter(id=latest_answer_id, updated_at__gt=previous_check_in.created_at)
if(len(answers) > 0):
answer = answers[0]
if answer.point == point:
if answer.problem_type.title == 'CAM':
if answer.updated_at is not None:
answer_serializer = AnswerSerializer(answer)
json['answer'] = answer_serializer.data
if not bounds: if not bounds:
return JsonResponse(json, status=status.HTTP_201_CREATED, safe=False) return JsonResponse(json, status=status.HTTP_201_CREATED, safe=False)
else: else:
......
digraph model_graph {
// Dotfile by Django-Extensions graph_models
// Created: 2017-05-20 22:30
// Cli Options: api
fontname = "Helvetica"
fontsize = 8
splines = true
node [
fontname = "Helvetica"
fontsize = 8
shape = "plaintext"
]
edge [
fontname = "Helvetica"
fontsize = 8
]
// Labels
subgraph cluster_django_contrib_admin {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
django.contrib.admin
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
django_contrib_admin_models_LogEntry [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
LogEntry
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">content_type</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">action_flag</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">PositiveSmallIntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">action_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">change_message</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">object_id</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">TextField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">object_repr</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
}
subgraph cluster_django_contrib_auth {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
django.contrib.auth
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
django_contrib_auth_models_AbstractUser [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
AbstractUser<BR/>&lt;<FONT FACE="Helvetica Italic">AbstractBaseUser,PermissionsMixin</FONT>&gt;
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">date_joined</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">email</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">EmailField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">first_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">is_active</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">is_staff</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">is_superuser</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">last_login</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">last_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">password</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">username</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_auth_models_Permission [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Permission
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">content_type</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">codename</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">name</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_auth_models_Group [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Group
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">name</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_auth_models_User [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
User<BR/>&lt;<FONT FACE="Helvetica Italic">AbstractUser</FONT>&gt;
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">date_joined</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">email</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">EmailField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">first_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">is_active</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">is_staff</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">is_superuser</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">last_login</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">last_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Italic">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">password</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">username</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">CharField</FONT>
</TD></TR>
</TABLE>
>]
}
subgraph cluster_django_contrib_contenttypes {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
django.contrib.contenttypes
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
django_contrib_contenttypes_models_ContentType [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
ContentType
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">app_label</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">model</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
}
subgraph cluster_django_contrib_sessions {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
django.contrib.sessions
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
django_contrib_sessions_base_session_AbstractBaseSession [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
AbstractBaseSession
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">expire_date</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">session_data</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">TextField</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_sessions_models_Session [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Session<BR/>&lt;<FONT FACE="Helvetica Italic">AbstractBaseSession</FONT>&gt;
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ItalicBold">session_key</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ItalicBold">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">expire_date</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Italic">session_data</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Italic">TextField</FONT>
</TD></TR>
</TABLE>
>]
}
subgraph cluster_django_contrib_gis {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
django.contrib.gis
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
django_contrib_gis_db_backends_postgis_models_PostGISGeometryColumns [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
PostGISGeometryColumns
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">srid</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">coord_dimension</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">f_geometry_column</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">f_table_catalog</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">f_table_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">f_table_schema</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">type</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_gis_db_backends_postgis_models_PostGISSpatialRefSys [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
PostGISSpatialRefSys
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">srid</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">auth_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">auth_srid</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">proj4text</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">srtext</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
}
subgraph cluster_api {
label=<
<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER">
<FONT FACE="Helvetica Bold" COLOR="Black" POINT-SIZE="12">
api
</FONT>
</TD></TR>
</TABLE>
>
color=olivedrab4
style="rounded"
api_models_User [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
User
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">device_id</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">email</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">service</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">service_uid</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">username</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_Game [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Game
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">description</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">end_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">game_code</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">location_name</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">max_duration</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">start_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">title</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_UserGame [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
UserGame
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">end_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">start_time</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
api_models_Message [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Message
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user_game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">content</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
api_models_PointType [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
PointType
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">description</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">title</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_ProblemType [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
ProblemType
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">description</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">title</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_Point [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Point
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">problem_type</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">description</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">hint</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">lat</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DecimalField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">lon</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DecimalField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">order</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">problem_description</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">question</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">time_penalty</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">IntegerField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">title</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_ProblemSolution [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
ProblemSolution
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">point</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">is_correct_answer</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">solution</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
api_models_Answer [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Answer
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">point</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">problem_type</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user_game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">given_answer</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">CharField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">is_correct</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">BooleanField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">photo</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">FileField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">updated_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
</TABLE>
>]
api_models_CheckIn [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
CheckIn
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">current_point</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">latest_answer</FONT>
</TD><TD ALIGN="LEFT">
<FONT COLOR="#7B7B7B" FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">user_game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">lat</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DecimalField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">lon</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DecimalField</FONT>
</TD></TR>
</TABLE>
>]
api_models_Bounds [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">
Bounds
</FONT></TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">id</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">AutoField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica Bold">game</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica Bold">ForeignKey (id)</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">created_at</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">DateTimeField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">mpoly</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">MultiPolygonField</FONT>
</TD></TR>
<TR><TD ALIGN="LEFT" BORDER="0">
<FONT FACE="Helvetica ">notification_text</FONT>
</TD><TD ALIGN="LEFT">
<FONT FACE="Helvetica ">CharField</FONT>
</TD></TR>
</TABLE>
>]
}
// Relations
django_contrib_admin_models_LogEntry -> django_contrib_auth_models_User
[label="user (logentry)"] [arrowhead=none, arrowtail=dot, dir=both];
django_contrib_admin_models_LogEntry -> django_contrib_contenttypes_models_ContentType
[label="content_type (logentry)"] [arrowhead=none, arrowtail=dot, dir=both];
django_contrib_auth_base_user_AbstractBaseUser [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">AbstractBaseUser</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_auth_models_AbstractUser -> django_contrib_auth_base_user_AbstractBaseUser
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
django_contrib_auth_models_PermissionsMixin [label=<
<TABLE BGCOLOR="palegoldenrod" BORDER="0" CELLBORDER="0" CELLSPACING="0">
<TR><TD COLSPAN="2" CELLPADDING="4" ALIGN="CENTER" BGCOLOR="olivedrab4">
<FONT FACE="Helvetica Bold" COLOR="white">PermissionsMixin</FONT>
</TD></TR>
</TABLE>
>]
django_contrib_auth_models_AbstractUser -> django_contrib_auth_models_PermissionsMixin
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
django_contrib_auth_models_Permission -> django_contrib_contenttypes_models_ContentType
[label="content_type (permission)"] [arrowhead=none, arrowtail=dot, dir=both];
django_contrib_auth_models_Group -> django_contrib_auth_models_Permission
[label="permissions (group)"] [arrowhead=dot arrowtail=dot, dir=both];
django_contrib_auth_models_User -> django_contrib_auth_models_Group
[label="groups (user)"] [arrowhead=dot arrowtail=dot, dir=both];
django_contrib_auth_models_User -> django_contrib_auth_models_Permission
[label="user_permissions (user)"] [arrowhead=dot arrowtail=dot, dir=both];
django_contrib_auth_models_User -> django_contrib_auth_models_AbstractUser
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
django_contrib_sessions_models_Session -> django_contrib_sessions_base_session_AbstractBaseSession
[label="abstract\ninheritance"] [arrowhead=empty, arrowtail=none, dir=both];
api_models_UserGame -> api_models_User
[label="user (usergame)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_UserGame -> api_models_Game
[label="game (usergame)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Message -> api_models_UserGame
[label="user_game (messages)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Message -> api_models_User
[label="user (message)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Point -> api_models_Game
[label="game (points)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Point -> api_models_ProblemType
[label="problem_type (point)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Point -> api_models_PointType
[label="point_type (point)"] [arrowhead=dot arrowtail=dot, dir=both];
api_models_ProblemSolution -> api_models_Point
[label="point (solutions)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Answer -> api_models_UserGame
[label="user_game (answer)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Answer -> api_models_Point
[label="point (answer)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Answer -> api_models_ProblemType
[label="problem_type (answer)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_CheckIn -> api_models_UserGame
[label="user_game (checkin)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_CheckIn -> api_models_Point
[label="current_point (checkin)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_CheckIn -> api_models_Answer
[label="latest_answer (checkin)"] [arrowhead=none, arrowtail=dot, dir=both];
api_models_Bounds -> api_models_Game
[label="game (bounds)"] [arrowhead=none, arrowtail=dot, dir=both];
}
...@@ -24,7 +24,7 @@ SECRET_KEY = 'g-6b+0)v(%=p$^6z7-prl5z@e*-6(x=b*cflbowz=us&&$2@j#' ...@@ -24,7 +24,7 @@ SECRET_KEY = 'g-6b+0)v(%=p$^6z7-prl5z@e*-6(x=b*cflbowz=us&&$2@j#'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = True
ALLOWED_HOSTS = ['128.199.63.125', '127.0.0.1'] ALLOWED_HOSTS = ['127.0.0.1']
# Application definition # Application definition
...@@ -87,8 +87,7 @@ DATABASES = { ...@@ -87,8 +87,7 @@ DATABASES = {
'NAME': 'andmebaasinimi', 'NAME': 'andmebaasinimi',
'USER': 'kasutajanimi', 'USER': 'kasutajanimi',
'PASSWORD': 'parool', 'PASSWORD': 'parool',
'HOST': '127.0.0.1', 'HOST': 'aadress',
'PORT': '5432',
} }
} }
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment