Skip to content

Backend untuk komunitas Surabaya.py mulai dari web, database dan bot

Notifications You must be signed in to change notification settings

surabayapy/community-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

from flask import Flask, jsonify, abort, make_response, request
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

Flask Config

user = 'root'
password = 'root'
host = 'localhost'
port = 3306
dbname = 'surabayapy'

db_uri = 'mysql+mysqldb://%s:%s@%s:%d/%s' % (user, password, host, port, dbname)
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

Supporting Function

import hashlib
def hashit(text):
    text = text.encode('UTF-8')
    hash_object = hashlib.sha256(text)
    hex_dig = hash_object.hexdigest()
    return hex_dig
def vdir(obj):
    return [x for x in dir(obj) if not x.startswith('_')]
def savedb(data):
    db.session.add(data)
    db.session.commit()
def waktu(data):
    return datetime.strptime(data, '%d %b %Y %H:%M')

Database

daftar_hadir = db.Table('daftar_hadir',
    db.Column('kegiatan',db.Integer, db.ForeignKey('kegiatan.id'), index=True),
    db.Column('peserta',db.Integer, db.ForeignKey('anggota.id'), index=True),
)
class Anggota(db.Model):
    __table_args__ = {'extend_existing': True}  
    
    id = db.Column(db.Integer, primary_key=True)
    nama = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    telegram = db.Column(db.String(64), unique=True, nullable=False)
    github = db.Column(db.String(15), unique=True, nullable=True)
    key = db.Column(db.String(4), unique=True, nullable=True)
    cari_kerja = db.Column(db.Boolean, nullable=False)
    tanggal_terdaftar = db.Column(db.DateTime, default=datetime.utcnow)
    ikut_serta = db.relationship('Kegiatan', secondary='daftar_hadir', backref=db.backref('peserta', lazy='dynamic'))

    def __repr__(self):
        return '<Anggota %r>' % self.telegram
class Kegiatan(db.Model):
    __table_args__ = {'extend_existing': True} 
    
    id = db.Column(db.Integer, primary_key=True)
    tema =  db.Column(db.Text, nullable=False)
    pembicara = db.Column(db.Text,  nullable=False)
    tempat = db.Column(db.Text,  nullable=False)
    maps = db.Column(db.String(80), nullable=True)
    waktu = db.Column(db.DateTime, nullable=False)
    pendaftaran = db.Column(db.DateTime, nullable=False)

    def __repr__(self):
        return '<Kegiatan %r>' % self.tema
class Lowongan(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    pengirim = db.Column(db.String(80), nullable=False)
    judul = db.Column(db.String(80),  nullable=False)
    pesan = db.Column(db.Text, nullable=False)
    
    def __repr__(self):
        return '<Lowongan %r>' % self.judul
db.create_all()

Fungsi Operasi

def registrasi_anggota(nama, email, telegram, github='', cari_kerja=False):
    try:
        anggota_baru = Anggota(nama=nama, email=email, telegram=telegram, github=github, cari_kerja=cari_kerja)
        savedb(anggota_baru)
        
        data= {
            'id' : anggota_baru.id,
            'nama' : anggota_baru.nama,
            'email' : anggota_baru.email,
            'telegram' : anggota_baru.telegram,
            'github' : anggota_baru.github,
            'cari_kerja' : anggota_baru.cari_kerja
        }
        return {'status': 'success', 'data': data}, 201
    
    except:
        db.session.rollback()
        return {'status': 'failed', 'data': 'Username, email, telegram atau github sudah digunakan'}, 400
def buat_kegiatan(tema, pembicara, tempat, maps, waktuacara, pendaftaran):
    try:
        kegiatan_baru = Kegiatan(tema = tema, pembicara = pembicara, tempat = tempat, maps = maps, waktu = waktu(waktuacara), pendaftaran = waktu(pendaftaran))
        savedb(kegiatan_baru)
        data= {
            'id' : kegiatan_baru.id,
            'tema' : kegiatan_baru.tema,
            'pembicara' : kegiatan_baru.pembicara,
            'tempat' : kegiatan_baru.tempat,
            'maps' : kegiatan_baru.maps,
            'waktu' : kegiatan_baru.waktu,
            'pendaftaran' : kegiatan_baru.pendaftaran
        }
        
        return {'status': 'success', 'data': data}, 201
    except:
        db.session.rollback()
        return {'status': 'failed', 'data': 'Kegiatan tidak dapat didaftarkan'}, 400
def kegiatan_peserta(anggota_telegram):
    try:
        anggota = Anggota.query.filter_by(telegram=anggota_telegram).first()
        info_anggota =[]
        for kegiatan in anggota.ikut_serta:
            data = {
                'id': kegiatan.id,
                'tema': kegiatan.tema,
                'pembicara': kegiatan.pembicara,
                'tempat': kegiatan.tempat,
                'maps': kegiatan.maps,
                'waktu': kegiatan.waktu
            }
            info_anggota.append(data)
        return {'status': 'success', 'data': info_anggota}, 200
    except:
        return {'status': 'failed', 'data': 'Not found'}, 404
def mendaftar_kegiatan(anggota_telegram, idkegiatan):
    try:
        anggota = Anggota.query.filter_by(telegram=anggota_telegram).first()
        kegiatan = Kegiatan.query.filter_by(id=idkegiatan).first()
        kegiatan.peserta.append(anggota)
        db.session.commit()
        response = kegiatan_peserta(anggota_telegram)
        return response[0], 201
    except:
        return {'status': 'failed', 'data': 'Not found'}, 404
def list_kegiatan(mode, idkegiatan=0):
    try:
        if mode == 'tema':
            daftar_kegiatan = []
            for kegiatan in Kegiatan.query:
                data = {
                    'tema' : kegiatan.tema,
                    'id' : kegiatan.id
                }
                daftar_kegiatan.append(data)
            return {'status': 'success', 'data': daftar_kegiatan}, 200
        
        elif mode == 'peserta':
            kegiatan = Kegiatan.query.filter_by(id=idkegiatan).first()
            daftar_peserta = []
            for peserta in kegiatan.peserta:
                daftar_peserta.append(peserta.telegram)
            return {'status': 'success', 'data': daftar_peserta}, 200
        
    except:
        return {'status': 'failed', 'data': 'Not found'}, 404

API

HTTP Method Action Examples Fungsi yang digunakan
Post Registrasi Anggota /api/daftar-anggota/ registrasi_anggota(nama, email, telegram, github, cari_kerja)
Post Membuat Kegiatan /api/buat-kegiatan/ buat_kegiatan(tema, pembicara, tempat, maps, waktu, pendaftaran)
Post Mendaftar Kegiatan /api/mendaftar-kegiatan/ mendaftar_kegiatan(anggota_telegram, tema)
Get List semua kegiatan selanjutnya /api/daftar-kegiatan/ list_kegiatan('tema')
Get List semua peserta kegiatan /api/peserta-kegiatan/id-kegiatan/ list_kegiatan('peserta', id-kegiatan)
Get List semua kegiatan peserta /api/kegiatan/id-telegram/ kegiatan_peserta(id-telegram)

Bold bisa diakses oleh admin saja

@app.route('/api/daftar-anggota/', methods=['POST'])
def api_daftar_anggota():
    if request.method == 'POST':
        parameter = ['nama', 'email', 'telegram', 'github']
        if not request.json or not set(parameter).issubset(request.json):
            response = {'status': 'failed', 'data': 'Bad Request'}, 400
        else:
            content = request.json
            response = registrasi_anggota(content["nama"], content["email"], content["telegram"], content["github"])
    return jsonify(response[0]), response[1]
    

@app.route('/api/buat-kegiatan/', methods=['POST'])
def api_buat_kegiatan():
    if request.method == 'POST':
        parameter = ['tema', 'pembicara', 'tempat', 'maps', 'waktu', 'pendaftaran']
        if not request.json or not set(parameter).issubset(request.json):
            response = {'status': 'failed', 'data': 'Bad Request'}, 400
        else:
            content = request.json
            response = buat_kegiatan(content["tema"], content["pembicara"], content["tempat"], content["maps"], content["waktu"], content["pendaftaran"])
    return jsonify(response[0]), response[1]
    

@app.route('/api/mendaftar-kegiatan/', methods=['POST'])
def api_mendaftar_kegiatan():
    if request.method == 'POST':
        parameter = ['anggota_telegram', 'idkegiatan']
        if not request.json or not set(parameter).issubset(request.json):
            response = {'status': 'failed', 'data': 'Bad Request'}, 400
        else:
            content = request.json
            response = mendaftar_kegiatan(content["anggota_telegram"], content["idkegiatan"])
    return jsonify(response[0]), response[1]
     

@app.route('/api/daftar-kegiatan/', methods=['GET'])
def api_kegiatan():
    if request.method == 'GET':
        response = list_kegiatan('tema')
    return jsonify(response[0]), response[1]
     

@app.route('/api/peserta-kegiatan/<int:idkegiatan>/', methods=['GET'])
def api_peserta_kegiatan(idkegiatan):
    if request.method == 'GET':
        response = list_kegiatan('peserta', idkegiatan)
    return jsonify(response[0]), response[1]
     

@app.route('/api/kegiatan/<idtelegram>/', methods=['GET'])
def api_kegiatan_idtelegram(idtelegram):
    if request.method == 'GET':
        response = kegiatan_peserta(idtelegram)
    return jsonify(response[0]), response[1]
     
@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not  Found'}), 404)

@app.errorhandler(400)
def not_found(error):
    return make_response(jsonify({'error': 'Bad Requesst'}), 404)
if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=False)
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [17/Apr/2018 00:21:47] "GET /api/kegiatan/tegarimansyah/ HTTP/1.1" 200 -

About

Backend untuk komunitas Surabaya.py mulai dari web, database dan bot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published