theenglishway (time) 6 лет назад
Родитель
Сommit
ab2eaa39f8

+ 2 - 1
pyplanner/__init__.py

@@ -3,4 +3,5 @@ __email__ = 'me@theenglishway.eu'
 __version__ = '0.1.0'
 
 
-from .database import Session
+from .database import Database, SQLABase
+from .models import *

+ 36 - 2
pyplanner/cli.py

@@ -1,12 +1,46 @@
 import click
+from .database import Database
+from .models import *
 
 
 @click.group()
-@click.option('-v', '--db', type=str, default='./planning.json', show_default=True)
+@click.option('-d', '--db_url', type=str, default='sqlite:///./sqlite3.db', show_default=True)
 @click.pass_context
-def main(ctx, db):
+def main(ctx, db_url):
     """Basic CLI project-handling"""
     ctx.ensure_object(dict)
+    db = Database(db_url)
+    ctx.obj['db'] = db
+    ctx.obj['session'] = db.session_factory()
+
+
+@main.group()
+@click.pass_context
+def milestone(ctx):
+    """Handle milestones"""
+    ctx.obj['model'] = Milestone
+
+
+@milestone.command('new')
+@click.option('--name', prompt='Milestone name')
+@click.option('--description', prompt='Milestone description')
+@click.pass_context
+def new_milestone(ctx, name, description):
+    """Add a new milestone"""
+    model = ctx.obj['model']
+    session = ctx.obj['session']
+    data = {
+        'name': name,
+        'description': description,
+        'uuid': 'pouet'
+    }
+    ok, errors = model.validate(data)
+    if ok :
+        m = model(**data)
+        session.add(m)
+        session.commit()
+    else:
+        click.echo(errors)
 
 
 if __name__ == '__main__':

+ 7 - 3
pyplanner/database.py

@@ -6,6 +6,10 @@ from sqlalchemy.ext.declarative import declarative_base
 SQLABase = declarative_base()
 
 
-engine = create_engine('sqlite:///./sqlite3.db')
-SQLABase.metadata.create_all(engine)
-Session = sessionmaker(bind=engine)
+class Database:
+    def __init__(self, db_url):
+        self.engine = create_engine(db_url)
+        self.session_factory = sessionmaker(bind=self.engine)
+
+        SQLABase.metadata.create_all(self.engine)
+

+ 19 - 3
pyplanner/models/__init__.py

@@ -1,11 +1,27 @@
-from pyplanner.database import SQLABase
 from datetime import datetime
 from sqlalchemy import Column, DateTime
+from pydantic import ValidationError
 
 
-class Base(SQLABase):
+class Base:
+    _schema = None
+
     date_created = Column(DateTime, default=datetime.utcnow)
     date_updated = Column(DateTime, onupdate=datetime.utcnow)
 
+    @classmethod
+    def validate(cls, data: dict):
+        try:
+            instance = cls._schema(**data)
+            return True, instance
+        except ValidationError as e:
+            return False, e
+
+
+from .milestones import Milestone
+from .sprints import Sprint
 
-from .milestones import Milestone
+__all__ = [
+    'Milestone',
+    'Sprint'
+]

+ 11 - 2
pyplanner/models/milestones.py

@@ -1,12 +1,21 @@
+from pyplanner.database import SQLABase
 from pyplanner.models import Base
 from sqlalchemy import Column, Integer, String, Text
+from pydantic import BaseModel
 
 
+class SchemaMilestone(BaseModel):
+    name: str
+    description: str
+    uuid: str
 
-class Milestone(Base):
-    __tablename__ = 'milestones'
 
+class Milestone(Base, SQLABase):
+    _schema = SchemaMilestone
+
+    __tablename__ = 'milestones'
     id = Column(Integer, primary_key=True)
+
     name = Column(String)
     description = Column(Text)
     uuid = Column(String)

+ 26 - 0
pyplanner/models/sprints.py

@@ -0,0 +1,26 @@
+from pyplanner.database import SQLABase
+from pyplanner.models import Base
+from sqlalchemy import Column, Integer, String, Text, ForeignKey
+from sqlalchemy.orm import relationship, backref
+from pydantic import BaseModel
+
+
+class SchemaSprint(BaseModel):
+    name: str
+    description: str
+    uuid: str
+    milestone_id: int
+
+
+class Sprint(SQLABase, Base):
+    _schema = SchemaSprint
+
+    __tablename__ = 'sprints'
+    id = Column(Integer, primary_key=True)
+
+    name = Column(String)
+    description = Column(Text)
+    uuid = Column(String)
+
+    milestone_id = Column(Integer, ForeignKey('milestones.id'))
+    milestone = relationship('Milestone', backref=backref('sprints'))