Переглянути джерело

implements basic django models

olinox 4 роки тому
батько
коміт
3c33f110e3

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
+  <component name="PyCharmProfessionalAdvertiser">
+    <option name="shown" value="true" />
+  </component>
+</project>

+ 1 - 1
.idea/orion.iml

@@ -2,7 +2,7 @@
 <module type="PYTHON_MODULE" version="4">
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
+    <orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
 </module>

+ 1 - 2
.idea/vcs.xml

@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
     <mapping directory="$PROJECT_DIR$" vcs="Git" />
-    <mapping directory="$PROJECT_DIR$/app/app" vcs="Git" />
-    <mapping directory="$PROJECT_DIR$/app/orion-app" vcs="Git" />
   </component>
 </project>

+ 83 - 3
.idea/workspace.xml

@@ -16,12 +16,31 @@
         <item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
       </path>
     </expand>
-    <select />
+    <select>
+      <path>
+        <item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
+        <item name="BRANCH:master" type="e8cecc67:BranchNodeDescriptor" />
+      </path>
+    </select>
   </component>
   <component name="ChangeListManager">
     <list default="true" id="c4e74122-a1c0-423a-8c9f-93e36772f14e" name="Default Changelist" comment="">
+      <change afterPath="$PROJECT_DIR$/.idea/.gitignore" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/doc/mcd.mwb" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/doc/mcd.mwb.bak" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/__init__.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/admin.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/apps.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/models.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/tests.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/urls.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/core/views.py" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/orion-server/requirements.txt" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/orion.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/orion.iml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/doc/specs/readme.md" beforeDir="false" afterPath="$PROJECT_DIR$/doc/specs/readme.md" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -43,8 +62,14 @@
     <property name="ASKED_SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
     <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/orion-server/core" />
+    <property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
   </component>
   <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="E:\dev\orion\orion-server\core" />
+      <recent name="E:\dev\orion\orion-server" />
+    </key>
     <key name="MoveFile.RECENT_KEYS">
       <recent name="E:\dev\orion\doc" />
     </key>
@@ -65,13 +90,68 @@
   <component name="Vcs.Log.Tabs.Properties">
     <option name="TAB_STATES">
       <map>
+        <entry key="1">
+          <value>
+            <State>
+              <option name="FILTERS">
+                <map>
+                  <entry key="branch">
+                    <value>
+                      <list>
+                        <option value="master" />
+                      </list>
+                    </value>
+                  </entry>
+                </map>
+              </option>
+            </State>
+          </value>
+        </entry>
         <entry key="MAIN">
           <value>
-            <State />
+            <State>
+              <option name="CUSTOM_BOOLEAN_PROPERTIES">
+                <map>
+                  <entry key="Show.Git.Branches" value="false" />
+                </map>
+              </option>
+              <option name="FILTERS">
+                <map>
+                  <entry key="branch">
+                    <value>
+                      <list>
+                        <option value="master" />
+                      </list>
+                    </value>
+                  </entry>
+                </map>
+              </option>
+            </State>
           </value>
         </entry>
       </map>
     </option>
     <option name="oldMeFiltersMigrated" value="true" />
   </component>
+  <component name="VcsManagerConfiguration">
+    <ignored-roots>
+      <path value="$PROJECT_DIR$/app/app" />
+      <path value="$PROJECT_DIR$/app/orion-app" />
+      <path value="$PROJECT_DIR$/orion-app" />
+    </ignored-roots>
+  </component>
+  <component name="WindowStateProjectService">
+    <state x="1170" y="267" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog" timestamp="1620425830908">
+      <screen x="0" y="0" width="1920" height="1040" />
+    </state>
+    <state x="1170" y="267" key="#com.intellij.refactoring.safeDelete.UnsafeUsagesDialog/0.0.1920.1040@0.0.1920.1040" timestamp="1620425830908" />
+    <state x="1233" y="229" key="FileChooserDialogImpl" timestamp="1620422856262">
+      <screen x="0" y="0" width="1920" height="1040" />
+    </state>
+    <state x="1233" y="229" key="FileChooserDialogImpl/0.0.1920.1040@0.0.1920.1040" timestamp="1620422856262" />
+    <state x="922" y="110" width="998" height="729" key="SettingsEditor" timestamp="1620422904887">
+      <screen x="0" y="0" width="1920" height="1040" />
+    </state>
+    <state x="922" y="110" width="998" height="729" key="SettingsEditor/0.0.1920.1040@0.0.1920.1040" timestamp="1620422904887" />
+  </component>
 </project>


BIN
doc/mcd.mwb.bak


+ 0 - 0
orion-server/core/__init__.py


+ 1 - 0
orion-server/core/admin.py

@@ -0,0 +1 @@
+from django.contrib import admin

+ 5 - 0
orion-server/core/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class CoreConfig(AppConfig):
+    name = 'core'

+ 168 - 0
orion-server/core/models.py

@@ -0,0 +1,168 @@
+import uuid
+
+from django.contrib.contenttypes.models import ContentType
+from django.core import serializers
+from django.db import models
+
+
+class BaseModel(models.Model):
+    id = models.UUIDField(default=uuid.uuid4, editable=False)
+    created = models.DateTimeField(auto_now_add=True)
+    updated = models.DateTimeField(auto_now=True)
+    objects = models.Manager()
+
+    class Meta:
+        abstract = True
+
+    def get_content_type(self):
+        return ContentType.objects.get_for_model(self)
+
+    def model_name(self):
+        try:
+            return self._meta.verbose_name
+        except AttributeError:
+            return ""
+
+    def to_json(self):
+        return serializers.serialize('json', [self, ])
+
+
+class Account(BaseModel):
+    class Meta:
+        verbose_name = "account"
+        verbose_name_plural = "accounts"
+
+    username = models.CharField(max_length=100)
+    password = models.CharField(max_length=100)
+    email = models.CharField(max_length=100)
+    last_login = models.DateTimeField()
+
+    def __str__(self):
+        return f"<Account {self.username} ({self.id})>"
+
+
+class Planet(BaseModel):
+    class Meta:
+        verbose_name = "planet"
+        verbose_name_plural = "planets"
+
+    name = models.CharField(max_length=100)
+
+    def __str__(self):
+        return f"<Planet {self.name} ({self.id})>"
+
+
+class Player(BaseModel):
+    class Meta:
+        verbose_name = "player"
+        verbose_name_plural = "players"
+
+    account = models.ForeignKey(Account, on_delete=models.PROTECT, verbose_name="Account")
+    planet = models.ForeignKey(Planet, on_delete=models.PROTECT, verbose_name="Planet")
+
+    def __str__(self):
+        return f"<Player {self.account.username}@{self.planet.name} ({self.id})>"
+
+
+class Dome(BaseModel):
+    class Meta:
+        verbose_name = "dome"
+        verbose_name_plural = "domes"
+
+    name = models.CharField(max_length=100)
+    player = models.ForeignKey(Player, on_delete=models.PROTECT, verbose_name="Player")
+    population = models.IntegerField(default=0)
+
+    def __str__(self):
+        return f"<Dome {self.name} ({self.id})>"
+
+
+class DomeBuilding(BaseModel):
+    class Meta:
+        verbose_name = "dome_building"
+        verbose_name_plural = "dome_buildings"
+
+    name = models.CharField(max_length=255)
+
+    def __str__(self):
+        return f"<DomeBuilding {self.name} ({self.id})>"
+
+
+class DomeBuildingInstance(BaseModel):
+    class Meta:
+        verbose_name = "dome_building_instance"
+        verbose_name_plural = "dome_building_instances"
+
+    dome = models.ForeignKey(Dome, on_delete=models.PROTECT, verbose_name="Dome")
+    dome_building = models.ForeignKey(DomeBuilding, on_delete=models.PROTECT, verbose_name="DomeBuilding")
+    level = models.IntegerField(default=1)
+
+    def __str__(self):
+        return f"<DomeBuildingInstance {self.dome_building.name}@{self.dome.name} ({self.id})>"
+
+
+class LocalisedBaseModel(BaseModel):
+    x = models.IntegerField()
+    y = models.IntegerField()
+
+
+class Colony(LocalisedBaseModel):
+    class Meta:
+        verbose_name = "colony"
+        verbose_name_plural = "colonies"
+
+    player = models.ForeignKey(Player, on_delete=models.PROTECT, verbose_name="Player")
+    name = models.CharField(max_length=100)
+
+    def __str__(self):
+        return f"<Colony {self.name} ({self.id})>"
+
+
+class ColonyBuilding(BaseModel):
+    class Meta:
+        verbose_name = "colony_building"
+        verbose_name_plural = "colony_buildings"
+
+    name = models.CharField(max_length=100)
+
+    def __str__(self):
+        return f"<ColonyBuilding {self.name} ({self.id})>"
+
+
+class ColonyBuildingInstance(LocalisedBaseModel):
+    class Meta:
+        verbose_name = "colony_building_instance"
+        verbose_name_plural = "colony_building_instances"
+
+    colony = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="Colony")
+    colony_building = models.ForeignKey(ColonyBuilding, on_delete=models.PROTECT, verbose_name="ColonyBuilding")
+
+    def __str__(self):
+        return f"<ColonyBuilding {self.colony_building.name}@{self.colony.name} ({self.id})>"
+
+
+class Transport(BaseModel):
+    class Meta:
+        verbose_name = "transport"
+        verbose_name_plural = "transports"
+
+    name = models.CharField(max_length=100)
+    max_distance = models.IntegerField()
+    required_building = models.IntegerField(null=True)
+
+    def __str__(self):
+        return f"<Transport {self.name} ({self.id})>"
+
+
+class Route(BaseModel):
+    class Meta:
+        verbose_name = "route"
+        verbose_name_plural = "routes"
+
+    origin = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="OriginColony")
+    target = models.ForeignKey(Colony, on_delete=models.PROTECT, verbose_name="TargetColony")
+    transport = models.ForeignKey(Transport, on_delete=models.PROTECT, verbose_name="Transport")
+
+    def __str__(self):
+        return f"<Route {self.origin.name}>{self.target.name} ({self.id})>"
+

+ 3 - 0
orion-server/core/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 16 - 0
orion-server/core/urls.py

@@ -0,0 +1,16 @@
+"""
+
+@author: olinox, 2021
+"""
+from django.conf import settings
+from django.urls import path
+from django.conf.urls.static import static
+
+from . import views
+
+
+urlpatterns = [
+    
+    path('', views.index, name='index'),
+
+] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 7 - 0
orion-server/core/views.py

@@ -0,0 +1,7 @@
+
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
+
+def index(request):
+    return render(request, 'index.html')
+

+ 6 - 0
orion-server/requirements.txt

@@ -0,0 +1,6 @@
+psycopg2-binary
+Django
+martor
+path.py
+mod_wsgi
+django-notifications-hq