Guest User

Untitled

a guest
Oct 11th, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.89 KB | None | 0 0
  1. from sqlalchemy.dialects.postgresql import ARRAY, DATERANGE, JSONB
  2. from sqlalchemy.sql import text, select
  3. from sqlalchemy_utils import DateRangeType
  4. from sqlalchemy import create_engine, Column, Integer, String, Text, ForeignKey, TIMESTAMP
  5. from sqlalchemy.orm import sessionmaker, relationship
  6. from sqlalchemy.ext.declarative import declarative_base
  7. import config as cfg
  8. import utils
  9.  
  10. from marshmallow_sqlalchemy import ModelSchema
  11. from marshmallow import fields
  12.  
  13. SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://kell:124124fwqf32@%s/kell" % cfg.DOMAIN
  14.  
  15. db = create_engine(SQLALCHEMY_DATABASE_URI)
  16. connection = db.connect()
  17.  
  18. Session = sessionmaker(bind=db)
  19.  
  20. db_session = Session()
  21.  
  22. Base = declarative_base()
  23.  
  24.  
  25. class Company(Base):
  26.  
  27.     __tablename__ = "companies"
  28.     company_id = Column(Text, primary_key=True)
  29.     name = Column(Text)
  30.     address = Column(Text, default="Moscow")
  31.     about = Column(Text)
  32.     status = Column(Text, default="enable")
  33.     data = Column(JSONB)
  34.     emblem = Column(Text, default="")
  35.     city = Column(Text, ForeignKey("cities.code"), default="177.MSK")
  36.  
  37.     COMPANY_DETAIL_TEMPLATE = {
  38.         "1": {"companyMenu": {"categories": [], "dishs": []}},
  39.         "2": {},
  40.         "3": {},
  41.         "4": {},
  42.         "5": {}
  43.     }
  44.  
  45.     def compose(self: Company, params: dict, create_user: bool = True):
  46.         # Делаем уникальный суффикс компании
  47.         company_suffix = utils.crc32(params)
  48.  
  49.         self.company_id = "-".join(
  50.             [params["city"], params["category"], company_suffix])  # Делаем id компании
  51.  
  52.         self.name = params["name"]
  53.         self.about = params["about"]
  54.  
  55.         self.data = self.COMPANY_DETAIL_TEMPLATE[params["category"]]
  56.         self.address = params["address"]
  57.  
  58.         self.city = params["city"]
  59.  
  60.         db_session.add(self)
  61.  
  62.         if create_user:
  63.             user_params = {
  64.                 "role": 0,
  65.                 "login": self.company_suffix,
  66.                 "password": utils.generate_password(8)
  67.             }
  68.             company_user = User(
  69.                 company_id=self.company_id).compose(params=user_params)
  70.  
  71.             db_session.add(company_user)
  72.  
  73.  
  74. class User(Base):
  75.     __tablename__ = "users"
  76.  
  77.     user_id = Column(Integer, primary_key=True)
  78.     role = Column(Integer, default=-1)
  79.     login = Column(Text)
  80.     password = Column(Text)
  81.     company_id = Column(Text, ForeignKey("companies.company_id"))
  82.     company = relationship(Company)
  83.  
  84.     def compose(self: User, params: dict):
  85.         self.role = params["role"]
  86.         self.login = params["login"]
  87.         self.password = params["password"]
  88.  
  89.  
  90. class Post(Base):
  91.     __tablename__ = "posts"
  92.  
  93.     post_id = Column(Integer, primary_key=True)
  94.     user_id = Column(Integer, ForeignKey("users.user_id"))
  95.     company_id = Column(Text, ForeignKey("companies.company_id"))
  96.     title = Column(Text)
  97.     data = Column(Text)
  98.     release_date = Column(ARRAY(TIMESTAMP))
  99.     address = Column(Text)
  100.     img_url = Column(Text)
  101.     second_img_url = Column(Text)
  102.     tags = Column(ARRAY(Text))
  103.     priority = Column(Integer, default=0)
  104.     cost = Column(Integer, default=0)
  105.  
  106.     company = relationship("Company", lazy="joined")
  107.  
  108.  
  109. class Tag(Base):
  110.     __tablename__ = "tags"
  111.     tag_id = Column(Integer, primary_key=True)
  112.     tag = Column(Text, primary_key=True)
  113.  
  114.  
  115. class File(Base):
  116.     __tablename__ = "files"
  117.     file_id = Column(Integer, primary_key=True)
  118.     company_id = Column(Text, ForeignKey("companies.company_id"))
  119.     name = Column(Text)
  120.     filename = Column(Text)
  121.     url = Column(Text)
  122.  
  123.  
  124. class City(Base):
  125.     __tablename__ = "cities"
  126.     code = Column(Text, primary_key=True)
  127.     name = Column(Text)
  128.  
  129.  
  130. class Category(Base):
  131.     __tablename__ = "categories"
  132.     id = Column(Text, primary_key=True)
  133.     name = Column(Text)
  134.     short_name = Column(Text)
  135.  
  136.  
  137. class Route(Base):
  138.     __tablename__ = "routes"
  139.     id = Column(Integer, primary_key=True)
  140.     name = Column(Text, default="Маршрут")
  141.     mapid = Column(Text)
  142.     about = Column(Text)
  143.     img_url = Column(Text)
  144.  
  145.  
  146. class Place(Base):
  147.     __tablename__ = "places"
  148.     id = Column(Integer, primary_key=True)
  149.     name = Column(Text, default="Место")
  150.     address = Column(Text)
  151.     about = Column(Text)
  152.     img_url = Column(Text)
  153.     company_id = Column(Text, ForeignKey("companies.company_id"))
  154.     category_id = Column(Text, ForeignKey("categories.id"))
  155.     tags = Column(ARRAY(Text))
  156.     priority = Column(Integer, default=0)
  157.  
  158.  
  159. # Marshmallow Schemas
  160.  
  161.  
  162. class CompanySchema(ModelSchema):
  163.     class Meta:
  164.         model = Company
  165.  
  166.         fields = ("name", "company_id", "address", "about", "status", "data",
  167.                   "emblem")
  168.  
  169.  
  170. class UserSchema(ModelSchema):
  171.     class Meta:
  172.         model = User
  173.  
  174.         fields = ("user_id", "company_id", "role", "login", "password")
  175.  
  176.  
  177. class PostSchema(ModelSchema):
  178.     company_name = fields.Str()
  179.  
  180.     class Meta:
  181.         model = Post
  182.  
  183.         fields = ("post_id", "company_id", "user_id", "title", "data",
  184.                   "release_date", "address", "img_url", "second_img_url",
  185.                   "tags", "priority", "cost")
  186.  
  187.  
  188. class TagSchema(ModelSchema):
  189.     class Meta:
  190.         model = Tag
  191.  
  192.  
  193. class CitySchema(ModelSchema):
  194.     class Meta:
  195.         model = City
  196.  
  197.  
  198. class FileSchema(ModelSchema):
  199.     class Meta:
  200.         model = File
  201.  
  202.         fields = ("file_id", "company_id", "name", "filename", "url")
  203.  
  204.  
  205. class CategorySchema(ModelSchema):
  206.     class Meta:
  207.         model = Category
  208.  
  209.  
  210. class RouteSchema(ModelSchema):
  211.     class Meta:
  212.         model = Route
  213.  
  214.  
  215. class PlaceSchema(ModelSchema):
  216.     class Meta:
  217.         model = Place
  218.  
  219.         fields = ("img_url", "id", "name", "address",
  220.                   "about", "company_id", "tags", "priority")
  221.  
  222.  
  223. def result_to_json(result, schema):
  224.     return schema().dump(result).data
Add Comment
Please, Sign In to add comment