Browse Source

swithcing to python

logicp 6 years ago
parent
commit
353028a5e7
6 changed files with 143 additions and 5 deletions
  1. 1 0
      .gitignore
  2. 1 2
      package.json
  3. BIN
      server/__pycache__/db.cpython-36.pyc
  4. 68 0
      server/db.py
  5. 70 0
      server/main.py
  6. 3 3
      src/form.js

+ 1 - 0
.gitignore

@@ -8,6 +8,7 @@
 # testing
 /coverage
 
+/server/cenv
 # production
 /build
 

+ 1 - 2
package.json

@@ -34,6 +34,5 @@
     "not dead",
     "not ie <= 11",
     "not op_mini all"
-  ],
-  "proxy": "http://localhost:3002/"
+  ]
 }

BIN
server/__pycache__/db.cpython-36.pyc


+ 68 - 0
server/db.py

@@ -0,0 +1,68 @@
+from aiopg.sa import create_engine as async_engine
+from sqlalchemy import ForeignKey, CheckConstraint
+from sqlalchemy import create_engine
+from sqlalchemy import Column, Integer, String, Text, DECIMAL, Boolean, exc, event, MetaData, select, DateTime
+from sqlalchemy import desc
+from sqlalchemy import func
+from sqlalchemy.sql.expression import true, false
+from sqlalchemy.engine.url import URL
+from sqlalchemy.orm import sessionmaker, relationship, backref
+from sqlalchemy.ext.associationproxy import association_proxy
+from sqlalchemy.ext.declarative import declarative_base, as_declarative, declared_attr
+import json
+
+DATABASE = {
+    'drivername': 'postgres',
+    'host': '127.0.0.1',
+    'port': '5432',
+    'username': 'xmasdamin',
+    'password': 'xmasadmin',
+    'database': 'xmasdb'
+}
+
+Base = declarative_base()
+metadata = MetaData()
+engine = create_engine(URL(**DATABASE))
+Session = sessionmaker(bind=engine)
+
+session = Session()
+
+class Attendee(Base):
+    __tablename__ = 'attendee'
+    id = Column(Integer, primary_key=True)
+    name = Column(String)
+    guest = Column(Boolean)
+    cat = Column(String)
+
+    def serialize(self):
+        return {
+            'id': self.id,
+            'name': self.name,
+            'cat': self.cat,
+            'guest': str(self.guest)
+        }
+
+
+async def add_attendee(name, guest, cat):
+    attendee = session.query(Attendee).filter(Attendee.name == name).first()
+    if attendee is None:
+        attendee = Attendee(name=name, guest=guest, cat=cat)
+    else:
+        attendee.name = name
+        attendee.guest = guest
+        attendee.cat = cat
+
+    if attendee is not None:
+        session.add(attendee)
+        session.commit()
+        return True
+
+    else:
+        return False
+
+async def fetch_attendees():
+    attendees = session.query(Attendee).all()
+    if attendees is not None:
+        return attendees
+    else:
+        return False

+ 70 - 0
server/main.py

@@ -0,0 +1,70 @@
+import json
+
+from tornado import httpserver
+from tornado.ioloop import IOLoop
+from tornado.options import define
+from tornado.web import Application, RequestHandler
+
+from server import db
+
+define("port", default=3002, help="Default port for the WebServer")
+
+class XMasRequestHandler(RequestHandler):
+    def set_default_headers(self):
+        origin = self.request.headers.get('Origin')
+        if origin in ['http://localhost:3001', 'http://localhost', 'http://127.0.0.1', 'http://christmas.logicp.ca']:
+            self.set_header("access-control-allow-origin", origin)
+            self.set_header("Access-Control-Allow-Headers", "x-requested-with")
+            self.set_header('Access-Control-Allow-Methods', 'GET, PUT, DELETE, OPTIONS')
+            # HEADERS!
+            self.set_header("Access-Control-Allow-Headers", "access-control-allow-origin,authorization,content-type")
+
+
+class AttendeeHandler(XMasRequestHandler):
+    def data_received(self, chunk):
+        pass
+
+    def options(self, *args, **kwargs):
+        pass
+
+
+    async def post(self, *args, **kwargs):
+        print(self.request.body)
+        data = json.loads(self.request.body.decode('utf-8'))
+        result = await db.add_attendee(data['name'], data['guest'], data['cat'])
+        self.write(json.dumps({'response': str(result), 'error': str(not result)}))
+
+
+class ListHandler(XMasRequestHandler):
+    async def get(self, *args, **kwags):
+        attendees = await db.fetch_attendees()
+        self.write(json.dumps({'attendees': [{'name': x.name, 'guest': x.guest, 'cat': x.cat} for x in attendees]}))
+
+
+class ChristmasApplication(Application):
+    def __init__(self):
+        self.session = None
+
+        handlers = [
+            # Home
+            (r"/list", ListHandler),
+
+            # User GUI
+
+            # - Profile
+            (r"/attendee", AttendeeHandler),
+        ]
+        settings = {
+            "debug": True,
+            "cookie_secret": "ashda89sduaosihdsauDIOh",
+        }
+
+        Application.__init__(self, handlers, **settings)
+
+if __name__ == "__main__":
+    application = ChristmasApplication()
+    http_server = httpserver.HTTPServer(application)
+    http_server.listen(3002)
+    db.Base.metadata.create_all(bind=db.engine)
+    loop_instance = IOLoop.instance()
+    loop_instance.start()

+ 3 - 3
src/form.js

@@ -104,10 +104,10 @@ class TextFields extends React.Component {
     const body = JSON.stringify({
       name: this.state.name,
       cat: this.state.cat,
-      significantOther: this.state.significantOther,
+      guest: this.state.significantOther,
     })
 
-    const response = await fetch('/api/attendee', {
+    const response = await fetch('http://localhost:3002/attendee', {
       method: 'post',
       body: body,
       headers: new Headers({
@@ -123,7 +123,7 @@ class TextFields extends React.Component {
 
   fetchAttendees = async () => {
     let attendees
-    await fetch('/api/list', {
+    await fetch('http://localhost:3002/list', {
       method: 'get',
     }).then(data => {
       data.json().then(finalData => {