diff --git a/webinterface/minibase/__init__.py b/webinterface/minibase/__init__.py index 16b9eb04..785930e7 100644 --- a/webinterface/minibase/__init__.py +++ b/webinterface/minibase/__init__.py @@ -1,5 +1,6 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy +from sqlalchemy.ext.declarative import declarative_base from flask_bcrypt import Bcrypt from flask_login import LoginManager from flask_mail import Mail @@ -22,6 +23,7 @@ def create_minibase(config_class=Config): app = Flask(__name__) app.config.from_object(Config) # (DATABASE) Initialisation + #db.metadata.clear() db.init_app(app) # (PASSWORD) Initialisation bcrypt.init_app(app) diff --git a/webinterface/minibase/__pycache__/__init__.cpython-311.pyc b/webinterface/minibase/__pycache__/__init__.cpython-311.pyc index 61e43c24..6bb6acb3 100644 Binary files a/webinterface/minibase/__pycache__/__init__.cpython-311.pyc and b/webinterface/minibase/__pycache__/__init__.cpython-311.pyc differ diff --git a/webinterface/minibase/__pycache__/models.cpython-311.pyc b/webinterface/minibase/__pycache__/models.cpython-311.pyc index c2734476..4b18a76e 100644 Binary files a/webinterface/minibase/__pycache__/models.cpython-311.pyc and b/webinterface/minibase/__pycache__/models.cpython-311.pyc differ diff --git a/webinterface/minibase/admin/__pycache__/forms.cpython-311.pyc b/webinterface/minibase/admin/__pycache__/forms.cpython-311.pyc index d7c91408..423654a0 100644 Binary files a/webinterface/minibase/admin/__pycache__/forms.cpython-311.pyc and b/webinterface/minibase/admin/__pycache__/forms.cpython-311.pyc differ diff --git a/webinterface/minibase/admin/__pycache__/models.cpython-311.pyc b/webinterface/minibase/admin/__pycache__/models.cpython-311.pyc new file mode 100644 index 00000000..2441cba5 Binary files /dev/null and b/webinterface/minibase/admin/__pycache__/models.cpython-311.pyc differ diff --git a/webinterface/minibase/admin/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/admin/__pycache__/routes.cpython-311.pyc index 2bbeefee..13f51ee3 100644 Binary files a/webinterface/minibase/admin/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/admin/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/admin/forms.py b/webinterface/minibase/admin/forms.py index bda9d929..912edc7b 100644 --- a/webinterface/minibase/admin/forms.py +++ b/webinterface/minibase/admin/forms.py @@ -1,7 +1,9 @@ from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired, ValidationError -from minibase.models import Company_legal_entity, Company_industry, Company_relation, Person_role, Person_competence +from minibase.database.models import Person_role +from minibase.database.models import Company_legal_entity, Company_relation +from minibase.database.models import Industry class compIndustryForm(FlaskForm): # Defines the form class to be used for the user registretion @@ -12,7 +14,7 @@ class compIndustryForm(FlaskForm): # Defines the form class to be used for the # Queries to be made in order to validate the form : If Relation Type exitst # Case Insensistive def validate_name(self, name): - industry_query = Company_industry.query.filter(Company_industry.name.ilike(name.data)).first() # Database Querry ilike means case insessitive + industry_query = Industry.query.filter(Industry.name.ilike(name.data)).first() # Database Querry ilike means case insessitive if industry_query: raise ValidationError('That Industry Type is already registered') @@ -66,4 +68,17 @@ class personCompetenceForm(FlaskForm): # Defines the form class to be used for def validate_name(self, name): person_competence_query = Person_role.query.filter(Person_role.name.ilike(name.data)).first() # Database Querry ilike means case insessitive if person_competence_query: - raise ValidationError('That Person Conpewtence is already registered') + raise ValidationError('That Person Conpetence is already registered') + + +class statusRegisterForm(FlaskForm): # Defines the form class to be used for the user registretion + # Decalarion of the fields for the form and it's propereties + name = StringField('Name', validators=[DataRequired()]) + description = StringField('Description', validators=[DataRequired()]) + submit = SubmitField('Register Status') + + # Queries to be made in order to validate the form : If Person Role exitst # Case Insensistive + def validate_name(self, name): + person_competence_query = Status.query.filter(Status.name.ilike(name.data)).first() # Database Querry ilike means case insessitive + if person_competence_query: + raise ValidationError('That Status is already registered') diff --git a/webinterface/minibase/admin/routes.py b/webinterface/minibase/admin/routes.py index 3f698c28..e2dc41fc 100644 --- a/webinterface/minibase/admin/routes.py +++ b/webinterface/minibase/admin/routes.py @@ -1,8 +1,10 @@ from flask import render_template, url_for, flash, redirect, request, Blueprint from minibase import db from minibase.config import themeMinibase -from minibase.models import Company, Company_industry, Company_legal_entity, Company_relation, Person_role, Person_competence -from minibase.admin.forms import compLegalEntityForm, compRelationForm, compIndustryForm,personRoleForm, personCompetenceForm +from minibase.database.models import Company, Company_legal_entity, Company_relation +from minibase.database.models import Industry +from minibase.database.models import Person_role, Person_competence +from minibase.admin.forms import compLegalEntityForm, compRelationForm, compIndustryForm,personRoleForm, personCompetenceForm, statusRegisterForm # Declaring a blueprint admin = Blueprint('admin', __name__) @@ -11,6 +13,7 @@ admin = Blueprint('admin', __name__) @admin.route("/company_register_legal_entity", methods=['GET', 'POST']) def company_register_legal_entity(): form = compLegalEntityForm() + legal_entities = Company_legal_entity.query.order_by(Company_legal_entity.name.asc()) if form.validate_on_submit(): companyLegal = Company_legal_entity( name=form.name.data, @@ -22,11 +25,13 @@ def company_register_legal_entity(): flash(f'{"Company Legal Entity registered!"}', 'success') return render_template('admin/company_register_legal_entity.html', title='Register Company Legal Entity', + legal_entities=legal_entities, theme=themeMinibase, form=form) return render_template('admin/company_register_legal_entity.html', title='Register Company Legal Entity', + legal_entities=legal_entities, theme=themeMinibase, form=form) @@ -34,6 +39,7 @@ def company_register_legal_entity(): @admin.route("/company_register_relation", methods=['GET', 'POST']) def company_register_relation(): form = compRelationForm() + relations = Company_relation.query.order_by(Company_relation.name.asc()) if form.validate_on_submit(): companyRelation = Company_relation( name=form.name.data, @@ -45,20 +51,23 @@ def company_register_relation(): flash(f'{"Company Relation registered!"}', 'success') return render_template('admin/company_register_relation.html', title='Register Company Relation', + relations=relations, theme=themeMinibase, form=form) return render_template('admin/company_register_relation.html', title='Register Company Relation', theme=themeMinibase, + relations=relations, form=form) @admin.route("/company_register_industry", methods=['GET', 'POST']) def company_register_industry(): form = compIndustryForm() + industries = Industry.query.order_by(Industry.name.asc()) if form.validate_on_submit(): - companyIndustry = Company_industry( + companyIndustry = Industry( name=form.name.data, description=form.description.data) # Here we need to give the id of thr role as this is a foreign key @@ -68,11 +77,13 @@ def company_register_industry(): flash(f'{"Company Idustry registered!"}', 'success') return render_template('admin/company_register_industry.html', title='Register Company Industry', + industries=industries, theme=themeMinibase, form=form) return render_template('admin/company_register_industry.html', title='Register Company Industry', + industries=industries, theme=themeMinibase, form=form) @@ -80,6 +91,7 @@ def company_register_industry(): @admin.route("/person_register_role", methods=['GET', 'POST']) def person_register_role(): form = personRoleForm() + roles = Person_role.query.order_by(Person_role.name.asc()) if form.validate_on_submit(): personRole = Person_role( name=form.name.data, @@ -92,17 +104,20 @@ def person_register_role(): return render_template('admin/person_register_role.html', title='Register Person_role', theme=themeMinibase, + roles=roles, form=form) return render_template('admin/person_register_role.html', title='Register Person Role', theme=themeMinibase, + roles=roles, form=form) @admin.route("/person_register_competence", methods=['GET', 'POST']) def person_register_competence(): form = personCompetenceForm() + competences = Person_competence.query.order_by(Person_competence.name.asc()) if form.validate_on_submit(): personCompetence = Person_competence( name=form.name.data, @@ -114,10 +129,37 @@ def person_register_competence(): flash(f'{"Person Competence registered!"}', 'success') return render_template('admin/person_register_competence.html', title='Register Person Competence', + competences=competences, theme=themeMinibase, form=form) return render_template('admin/person_register_competence.html', title='Register Person Competence', theme=themeMinibase, + competences=competences, + form=form) + +@admin.route("/status_register", methods=['GET', 'POST']) +def status_register(): + form = statusRegisterForm() + statuses = Status.query.order_by(Status.name.asc()) + if form.validate_on_submit(): + statusRegister = Status( + name=form.name.data, + description=form.description.data) + # Here we need to give the id of thr role as this is a foreign key + db.session.add(statusRegister) + db.session.commit() + + flash(f'{"New Status registered!"}', 'success') + return render_template('admin/status_register.html', + title='Register Status', + statuses=statuses, + theme=themeMinibase, + form=form) + + return render_template('admin/status_register.html', + title='Register Status', + statuses=statuses, + theme=themeMinibase, form=form) diff --git a/webinterface/minibase/company/__pycache__/forms.cpython-311.pyc b/webinterface/minibase/company/__pycache__/forms.cpython-311.pyc index f283baf0..44326d88 100644 Binary files a/webinterface/minibase/company/__pycache__/forms.cpython-311.pyc and b/webinterface/minibase/company/__pycache__/forms.cpython-311.pyc differ diff --git a/webinterface/minibase/company/__pycache__/models.cpython-311.pyc b/webinterface/minibase/company/__pycache__/models.cpython-311.pyc new file mode 100644 index 00000000..9c7ed541 Binary files /dev/null and b/webinterface/minibase/company/__pycache__/models.cpython-311.pyc differ diff --git a/webinterface/minibase/company/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/company/__pycache__/routes.cpython-311.pyc index 479f15ea..d60f5b50 100644 Binary files a/webinterface/minibase/company/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/company/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/company/__pycache__/utils.cpython-311.pyc b/webinterface/minibase/company/__pycache__/utils.cpython-311.pyc index fbc49cde..af34ecc5 100644 Binary files a/webinterface/minibase/company/__pycache__/utils.cpython-311.pyc and b/webinterface/minibase/company/__pycache__/utils.cpython-311.pyc differ diff --git a/webinterface/minibase/company/forms.py b/webinterface/minibase/company/forms.py index 7842ccb9..82e3baf6 100644 --- a/webinterface/minibase/company/forms.py +++ b/webinterface/minibase/company/forms.py @@ -1,7 +1,7 @@ from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, IntegerField, SelectField from wtforms.validators import DataRequired, Length, ValidationError, Optional -from minibase.models import Company +from minibase.database.models import Company import minibase.database.utils as DbUtils diff --git a/webinterface/minibase/company/routes.py b/webinterface/minibase/company/routes.py index 32081747..8d8e0464 100644 --- a/webinterface/minibase/company/routes.py +++ b/webinterface/minibase/company/routes.py @@ -1,7 +1,8 @@ from flask import render_template, url_for, flash, redirect, request, Blueprint from minibase import db from minibase.config import themeMinibase -from minibase.models import Company, Company_industry +from minibase.database.models import Company +from minibase.database.models import Industry from minibase.company.forms import companyForm import minibase.company.utils as utils diff --git a/webinterface/minibase/company/utils.py b/webinterface/minibase/company/utils.py index 717b8148..324c9daa 100644 --- a/webinterface/minibase/company/utils.py +++ b/webinterface/minibase/company/utils.py @@ -1,11 +1,12 @@ import os -from minibase.models import Company, Company_industry, Company_relation, Company_legal_entity +from minibase.database.models import Company, Company_relation, Company_legal_entity +from minibase.database.models import Industry # Retunrs the qurry of all awailable industrie names on the table named Company_industr # Note that the formating is done during the SQLAlchemy Table declaration. def company_industry_choices(): - choices = Company_industry.query.all() + choices = Industry.query.all() return choices @@ -27,7 +28,7 @@ def company_relation_choices(): # And not the name. so this function returns the right ID of the name shown at the # Register Company Form def getIndustryId(nameForId): - selection = Company_industry.query.filter_by(name=nameForId).first() # Gets the id of Role + selection = Industry.query.filter_by(name=nameForId).first() # Gets the id of Role return selection.id diff --git a/webinterface/minibase/database/__pycache__/models.cpython-311.pyc b/webinterface/minibase/database/__pycache__/models.cpython-311.pyc new file mode 100644 index 00000000..7694ebc3 Binary files /dev/null and b/webinterface/minibase/database/__pycache__/models.cpython-311.pyc differ diff --git a/webinterface/minibase/database/__pycache__/utils.cpython-311.pyc b/webinterface/minibase/database/__pycache__/utils.cpython-311.pyc index 137541b7..8db3dfb0 100644 Binary files a/webinterface/minibase/database/__pycache__/utils.cpython-311.pyc and b/webinterface/minibase/database/__pycache__/utils.cpython-311.pyc differ diff --git a/webinterface/minibase/countries.sql b/webinterface/minibase/database/countries.sql similarity index 100% rename from webinterface/minibase/countries.sql rename to webinterface/minibase/database/countries.sql diff --git a/webinterface/minibase/models.py b/webinterface/minibase/database/models.py similarity index 91% rename from webinterface/minibase/models.py rename to webinterface/minibase/database/models.py index 7571c931..a8b40de8 100644 --- a/webinterface/minibase/models.py +++ b/webinterface/minibase/database/models.py @@ -10,6 +10,49 @@ def load_user(user_id): return User.query.get(int(user_id)) +class User(db.Model, UserMixin): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(20), unique=True, nullable=False) + email = db.Column(db.String(120), unique=True, nullable=False) + image_file = db.Column(db.String(20), nullable=False, default='default.jpg') + password = db.Column(db.String(60), nullable=False) + # Additional Querry to link a post wiht an author in the sql this won't be an field + posts = db.relationship('Post', backref='author', lazy=True) + + def get_reset_token(self, expires_sec=1800): + s = Serializer(current_app.config['SECRET_KEY'], expires_sec) + return s.dumps({'user_id': self.id}).decode('utf-8') + + @staticmethod + def verify_reset_token(token): + s = Serializer(current_app.config['SECRET_KEY']) + try: + user_id = s.loads(token)['user_id'] + except: + return 0 + return User.query.get(user_id) + + # returns a more information-rich, or official, string representation of an object + def __repr__(self): + return f"User('{self.username}', '{self.email}', '{self.image_file}')" + + +class Post(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(100), nullable=False) + + date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + content = db.Column(db.Text, nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + + # returns a more information-rich, or official, string representation of an object + def __repr__(self): + return f"User('{self.title}', '{self.date_posted}')" + + +################################################################################################### +# ADMIN +################################################################################################### class Countries(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.String(100), nullable=False) @@ -38,56 +81,40 @@ class Countries(db.Model): updated_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) flag = db.Column(db.Integer, nullable=False, default=1) wikiDataId = db.Column(db.String(255)) + # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): return f"{self.name}" -class Company(db.Model): +class Status(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) - name = db.Column(db.String(100), nullable=False) - legal_entity_id = db.Column(db.Integer, db.ForeignKey('company_legal_entity.id'), nullable=False) - relation_id = db.Column(db.Integer, db.ForeignKey('company_relation.id'), nullable=False) - industry_id = db.Column(db.Integer, db.ForeignKey('company_industry.id'), nullable=False) - - main_company = db.Column(db.Integer, nullable=False, default=1) - subsidiary_of = db.Column(db.Integer, nullable=True, default='') - website = db.Column(db.String(100), nullable=True, default='') - - street_bill = db.Column(db.String(100), nullable=False) - street_no_bill = db.Column(db.Integer, nullable=False) - city_bill = db.Column(db.String(100), nullable=False) - post_code_bill = db.Column(db.Integer, nullable=False) - state_bill = db.Column(db.String(100), nullable=False) - country_bill = db.Column(db.String(100), nullable=False) + name = db.Column(db.String(50), nullable=False) + description = db.Column(db.String(300), nullable=False) + upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) - street_ship = db.Column(db.String(100), nullable=False) - street_no_ship = db.Column(db.Integer, nullable=False) - city_ship = db.Column(db.String(100), nullable=False) - post_code_ship = db.Column(db.Integer, nullable=False) - state_ship = db.Column(db.String(100), nullable=False) - country_ship = db.Column(db.String(100), nullable=False) + # returns a more information-rich, or official, string representation of an object + def __repr__(self): + return f"{self.name}" - classification = db.Column(db.Integer, nullable=False, default=0) - comment = db.Column(db.String(300), nullable=True) - image_file = db.Column(db.String(20), nullable=False, default='default_company.jpg') - - employees = db.relationship('Person', backref='company', lazy=True) - notes = db.relationship('Company_note', backref='concerns', lazy=True) +class Industry(db.Model): + id = db.Column(db.Integer, nullable=False, primary_key=True) + name = db.Column(db.String(50), nullable=False) + description = db.Column(db.String(300), nullable=False) upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + companies = db.relationship('Company', backref='industry', lazy=True) # returns a more information-rich, or official, string representation of an object - # >>> company.query.all() - # [1, ComanyName, CompanyCounntry] (Do not change this presentation - # it will corrupt: the getCompanyId function in minibase.dabase.utils def __repr__(self): - return f"{self.name}, {self.country_bill}, {self.id}" + return f"{self.name}" +################################################################################################### +# Person +################################################################################################### class Person(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.String(50), nullable=False) @@ -127,8 +154,6 @@ class Person_role(db.Model): last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): return f"{self.name}" @@ -141,123 +166,97 @@ class Person_competence(db.Model): last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): return f"{self.name}" -class Company_industry(db.Model): - id = db.Column(db.Integer, nullable=False, primary_key=True) - name = db.Column(db.String(50), nullable=False) - description = db.Column(db.String(300), nullable=False) - upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) - companies = db.relationship('Company', backref='companies', lazy=True) +class Person_note(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(100), nullable=False) + content = db.Column(db.Text, nullable=False) + status = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + date_due = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) + person_id = db.Column(db.Integer, db.ForeignKey('person.id'), nullable=False) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): - return f"{self.name}" + return f"{self.title}, {self.status}, {self.content}" -class Company_relation(db.Model): +################################################################################################### +# Company +################################################################################################### +class Company(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) - name = db.Column(db.String(50), nullable=False) - description = db.Column(db.String(300), nullable=False) + name = db.Column(db.String(100), nullable=False) + + legal_entity_id = db.Column(db.Integer, db.ForeignKey('company_legal_entity.id'), nullable=False) + relation_id = db.Column(db.Integer, db.ForeignKey('company_relation.id'), nullable=False) + industry_id = db.Column(db.Integer, db.ForeignKey('industry.id'), nullable=False) + + main_company = db.Column(db.Integer, nullable=False, default=1) + subsidiary_of = db.Column(db.Integer, nullable=True, default='') + website = db.Column(db.String(100), nullable=True, default='') + + street_bill = db.Column(db.String(100), nullable=False) + street_no_bill = db.Column(db.Integer, nullable=False) + city_bill = db.Column(db.String(100), nullable=False) + post_code_bill = db.Column(db.Integer, nullable=False) + state_bill = db.Column(db.String(100), nullable=False) + country_bill = db.Column(db.String(100), nullable=False) + + street_ship = db.Column(db.String(100), nullable=False) + street_no_ship = db.Column(db.Integer, nullable=False) + city_ship = db.Column(db.String(100), nullable=False) + post_code_ship = db.Column(db.Integer, nullable=False) + state_ship = db.Column(db.String(100), nullable=False) + country_ship = db.Column(db.String(100), nullable=False) + + classification = db.Column(db.Integer, nullable=False, default=0) + comment = db.Column(db.String(300), nullable=True) + image_file = db.Column(db.String(20), nullable=False, default='default_company.jpg') + + employees = db.relationship('Person', backref='company', lazy=True) + notes = db.relationship('Company_note', backref='concerns', lazy=True) + upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] + # >>> company.query.all() + # [1, ComanyName, CompanyCounntry] (Do not change this presentation + # it will corrupt: the getCompanyId function in minibase.dabase.utils def __repr__(self): - return f"{self.name}" + return f"{self.name}, {self.country_bill}, {self.id}" -class Company_legal_entity(db.Model): +class Company_relation(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.String(50), nullable=False) description = db.Column(db.String(300), nullable=False) upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + companies = db.relationship('Company', backref='relation', lazy=True) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): return f"{self.name}" -class Status(db.Model): +class Company_legal_entity(db.Model): id = db.Column(db.Integer, nullable=False, primary_key=True) name = db.Column(db.String(50), nullable=False) description = db.Column(db.String(300), nullable=False) upload_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) last_update_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + companies = db.relationship('Company', backref='legal_entity', lazy=True) # returns a more information-rich, or official, string representation of an object - # >>> Company_industry.query.all() - # >>> [('1', 'Indsutrial'), ('2', 'Consumer')] def __repr__(self): return f"{self.name}" -class User(db.Model, UserMixin): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(20), unique=True, nullable=False) - email = db.Column(db.String(120), unique=True, nullable=False) - image_file = db.Column(db.String(20), nullable=False, default='default.jpg') - password = db.Column(db.String(60), nullable=False) - # Additional Querry to link a post wiht an author in the sql this won't be an field - posts = db.relationship('Post', backref='author', lazy=True) - - def get_reset_token(self, expires_sec=1800): - s = Serializer(current_app.config['SECRET_KEY'], expires_sec) - return s.dumps({'user_id': self.id}).decode('utf-8') - - @staticmethod - def verify_reset_token(token): - s = Serializer(current_app.config['SECRET_KEY']) - try: - user_id = s.loads(token)['user_id'] - except: - return 0 - return User.query.get(user_id) - - # returns a more information-rich, or official, string representation of an object - def __repr__(self): - return f"User('{self.username}', '{self.email}', '{self.image_file}')" - - -class Post(db.Model): - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(100), nullable=False) - - date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - content = db.Column(db.Text, nullable=False) - user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) - - # returns a more information-rich, or official, string representation of an object - def __repr__(self): - return f"User('{self.title}', '{self.date_posted}')" - - -class Person_note(db.Model): - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(100), nullable=False) - content = db.Column(db.Text, nullable=False) - status = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - date_due = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) - person_id = db.Column(db.Integer, db.ForeignKey('person.id'), nullable=False) - - # returns a more information-rich, or official, string representation of an object - def __repr__(self): - return f"{self.title}, {self.status}, {self.content}" - - class Company_note(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) @@ -270,3 +269,7 @@ class Company_note(db.Model): # returns a more information-rich, or official, string representation of an object def __repr__(self): return f"{self.title}, {self.status}, {self.content}" + +################################################################################################### +# Project +################################################################################################### diff --git a/webinterface/minibase/database/site.db b/webinterface/minibase/database/site.db new file mode 100644 index 00000000..a2869088 Binary files /dev/null and b/webinterface/minibase/database/site.db differ diff --git a/webinterface/minibase/database/utils.py b/webinterface/minibase/database/utils.py index 19d783a8..9738ca57 100644 --- a/webinterface/minibase/database/utils.py +++ b/webinterface/minibase/database/utils.py @@ -1,5 +1,7 @@ -from minibase.models import Company, Company_industry, Company_relation, Company_legal_entity -from minibase.models import Countries, Person, Person_role, Person_competence +from minibase.database.models import Company, Company_relation, Company_legal_entity +from minibase.database.models import Industry +from minibase.database.models import Person, Person_role, Person_competence +from minibase.database.models import Countries # Gets the id of company from the formated output defined at models.py for the Company Model @@ -78,10 +80,10 @@ def company_choices(): return choices -# Retunrs the qurry of all awailable industrie names on the table named Company_industry +# Retunrs the qurry of all awailable industrie names on the table named Industry # Note that the formating is done during the SQLAlchemy Table declaration. def company_industry_choices(): - choices = Company_industry.query.all() + choices = Industry.query.all() return choices @@ -103,7 +105,7 @@ def company_relation_choices(): # And not the name. so this function returns the right ID of the name shown at the # Register Company Form def getIndustryId(nameForId): - selection = Company_industry.query.filter_by(name=nameForId).first() # Gets the id of Role + selection = Industry.query.filter_by(name=nameForId).first() # Gets the id of Role return selection.id diff --git a/webinterface/minibase/main/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/main/__pycache__/routes.cpython-311.pyc index d427e3c5..17ff6aff 100644 Binary files a/webinterface/minibase/main/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/main/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/main/routes.py b/webinterface/minibase/main/routes.py index bb881731..8bd15b89 100644 --- a/webinterface/minibase/main/routes.py +++ b/webinterface/minibase/main/routes.py @@ -1,5 +1,5 @@ from flask import render_template, request, Blueprint -from minibase.models import Post +from minibase.database.models import Company, Post from minibase.config import themeMinibase from minibase import db @@ -14,8 +14,9 @@ def home(): page = request.args.get('page', 1, type=int) # (POSTS) Query posts usin SQLAlchemy posts = Post.query.order_by(Post.date_posted.asc()).paginate(per_page=2) + companies = Company.query.order_by(Company.name.asc()) # (HTML) Renders the template for templates/home.html - return render_template('home.html', theme=themeMinibase, posts=posts) + return render_template('home.html', theme=themeMinibase, posts=posts, companies=companies) @main.route("/about") diff --git a/webinterface/minibase/person/__pycache__/forms.cpython-311.pyc b/webinterface/minibase/person/__pycache__/forms.cpython-311.pyc index cee55a9b..b183639d 100644 Binary files a/webinterface/minibase/person/__pycache__/forms.cpython-311.pyc and b/webinterface/minibase/person/__pycache__/forms.cpython-311.pyc differ diff --git a/webinterface/minibase/person/__pycache__/models.cpython-311.pyc b/webinterface/minibase/person/__pycache__/models.cpython-311.pyc new file mode 100644 index 00000000..a75b3254 Binary files /dev/null and b/webinterface/minibase/person/__pycache__/models.cpython-311.pyc differ diff --git a/webinterface/minibase/person/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/person/__pycache__/routes.cpython-311.pyc index 6cfebc2a..82c78706 100644 Binary files a/webinterface/minibase/person/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/person/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/person/forms.py b/webinterface/minibase/person/forms.py index 2277c8fb..0c51c43c 100644 --- a/webinterface/minibase/person/forms.py +++ b/webinterface/minibase/person/forms.py @@ -1,7 +1,7 @@ from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, SelectField, DateField from wtforms.validators import DataRequired, Length, ValidationError, Email, Optional -from minibase.models import Person +from minibase.database.models import Person import minibase.database.utils as DbUtils diff --git a/webinterface/minibase/person/routes.py b/webinterface/minibase/person/routes.py index 7a292be2..10f556a7 100644 --- a/webinterface/minibase/person/routes.py +++ b/webinterface/minibase/person/routes.py @@ -1,7 +1,7 @@ from flask import render_template, url_for, flash, redirect, request, Blueprint from minibase import db from minibase.config import themeMinibase -from minibase.models import Person +from minibase.database.models import Person from minibase.person.forms import personForm import minibase.database.utils as DbUtils diff --git a/webinterface/minibase/posts/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/posts/__pycache__/routes.cpython-311.pyc index 9d3c7106..5d70422d 100644 Binary files a/webinterface/minibase/posts/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/posts/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/posts/routes.py b/webinterface/minibase/posts/routes.py index cf83a122..939c236a 100644 --- a/webinterface/minibase/posts/routes.py +++ b/webinterface/minibase/posts/routes.py @@ -2,7 +2,7 @@ from flask import (render_template, url_for, flash, redirect, request, abort, Blueprint) from flask_login import current_user, login_required from minibase import db -from minibase.models import Post +from minibase.database.models import Post from minibase.posts.forms import postForm from minibase.config import themeMinibase diff --git a/webinterface/minibase/project/forms.py b/webinterface/minibase/project/forms.py new file mode 100644 index 00000000..e69de29b diff --git a/webinterface/minibase/project/routes.py b/webinterface/minibase/project/routes.py new file mode 100644 index 00000000..e69de29b diff --git a/webinterface/minibase/site.db b/webinterface/minibase/site.db index 93e44643..dfcf21d4 100644 Binary files a/webinterface/minibase/site.db and b/webinterface/minibase/site.db differ diff --git a/webinterface/minibase/templates/admin/company_register_industry.html b/webinterface/minibase/templates/admin/company_register_industry.html index d8d74da9..3ee67fde 100644 --- a/webinterface/minibase/templates/admin/company_register_industry.html +++ b/webinterface/minibase/templates/admin/company_register_industry.html @@ -43,4 +43,23 @@ +
+

Existing Industries

+ + + + + + + + + {% for item in industries %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
{% endblock content %} diff --git a/webinterface/minibase/templates/admin/company_register_legal_entity.html b/webinterface/minibase/templates/admin/company_register_legal_entity.html index afbdea45..a2fe24c7 100644 --- a/webinterface/minibase/templates/admin/company_register_legal_entity.html +++ b/webinterface/minibase/templates/admin/company_register_legal_entity.html @@ -43,4 +43,23 @@ +
+

Existing Legal Entities

+ + + + + + + + + {% for item in legal_entities %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
{% endblock content %} diff --git a/webinterface/minibase/templates/admin/company_register_relation.html b/webinterface/minibase/templates/admin/company_register_relation.html index 0065e310..b9985672 100644 --- a/webinterface/minibase/templates/admin/company_register_relation.html +++ b/webinterface/minibase/templates/admin/company_register_relation.html @@ -45,4 +45,23 @@ +
+

Existing Relations

+ + + + + + + + + {% for item in relations %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
{% endblock content %} diff --git a/webinterface/minibase/templates/admin/person_register_competence.html b/webinterface/minibase/templates/admin/person_register_competence.html index d3c1aeef..4ea4a7b2 100644 --- a/webinterface/minibase/templates/admin/person_register_competence.html +++ b/webinterface/minibase/templates/admin/person_register_competence.html @@ -43,4 +43,23 @@ +
+

Existing Competences

+ + + + + + + + + {% for item in competences %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
{% endblock content %} diff --git a/webinterface/minibase/templates/admin/person_register_role.html b/webinterface/minibase/templates/admin/person_register_role.html index 683a71a4..b6c14921 100644 --- a/webinterface/minibase/templates/admin/person_register_role.html +++ b/webinterface/minibase/templates/admin/person_register_role.html @@ -43,4 +43,44 @@ + +
+
+

Existing Roles

+ + + + + + + + + {% for item in roles %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
+

Existing Roles

+ + + + + + + + + {% for item in roles %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
+ {% endblock content %} diff --git a/webinterface/minibase/templates/admin/status_register.html b/webinterface/minibase/templates/admin/status_register.html new file mode 100644 index 00000000..55b3c83e --- /dev/null +++ b/webinterface/minibase/templates/admin/status_register.html @@ -0,0 +1,65 @@ +{% extends "layout.html" %} +{% block content %} +
+
+ {{ form.hidden_tag() }} +
+ Register Status + + +
+ {{ form.name.label(class="form-control-label") }} + {% if form.name.errors %} + {{ form.name(class="form-control form-control-lg is-invalid") }} +
+ {% for error in form.name.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.name(class="form-control form-control-lg") }} + {% endif %} +
+ + +
+ {{ form.description.label(class="form-control-label") }} + {% if form.description.errors %} + {{ form.description(class="form-control form-control-lg is-invalid") }} +
+ {% for error in form.description.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {{ form.description(class="form-control form-control-lg") }} + {% endif %} +
+ + +
+ {{ form.submit(class="btn btn-outline-info") }} +
+ +
+
+
+

Existing Statuses

+ + + + + + + + + {% for item in statuses %} + + + + + {% endfor %} + +
NameDescription
{{ item.name }}{{ item.description}}
+
+{% endblock content %} diff --git a/webinterface/minibase/templates/home.html b/webinterface/minibase/templates/home.html index 9645bd11..cd545b09 100644 --- a/webinterface/minibase/templates/home.html +++ b/webinterface/minibase/templates/home.html @@ -6,25 +6,29 @@

Overwiev

-

Projects

+

Companies

- - - - - + + + + + + + {% for company in companies %} - - - - - + + + + + + + {% endfor %}
TotalActiveInactiveToDoWarningCompanyCountryWebsiteRelationIndustryID
23920039585{{ company.name }} {{ company.legal_entity}}{{ company.country_bill}} {{ company.website}} {{ company.relation}}{{ company.industry}}{{ company.id}}
diff --git a/webinterface/minibase/templates/layout.html b/webinterface/minibase/templates/layout.html index 193ae3b6..257c193a 100644 --- a/webinterface/minibase/templates/layout.html +++ b/webinterface/minibase/templates/layout.html @@ -52,6 +52,7 @@ Person Register Role Person Register Competence + Status Register Countries Database diff --git a/webinterface/minibase/users/__pycache__/forms.cpython-311.pyc b/webinterface/minibase/users/__pycache__/forms.cpython-311.pyc index 906ccb87..63f2c813 100644 Binary files a/webinterface/minibase/users/__pycache__/forms.cpython-311.pyc and b/webinterface/minibase/users/__pycache__/forms.cpython-311.pyc differ diff --git a/webinterface/minibase/users/__pycache__/routes.cpython-311.pyc b/webinterface/minibase/users/__pycache__/routes.cpython-311.pyc index 39f07443..91c21b4f 100644 Binary files a/webinterface/minibase/users/__pycache__/routes.cpython-311.pyc and b/webinterface/minibase/users/__pycache__/routes.cpython-311.pyc differ diff --git a/webinterface/minibase/users/forms.py b/webinterface/minibase/users/forms.py index 3350390c..5c9a3c7e 100644 --- a/webinterface/minibase/users/forms.py +++ b/webinterface/minibase/users/forms.py @@ -3,7 +3,7 @@ from flask_wtf.file import FileField, FileAllowed from wtforms import StringField, PasswordField, SubmitField, BooleanField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from flask_login import current_user -from minibase.models import User +from minibase.database.models import User class registrationForm(FlaskForm): # Defines the form class to be used for the user registretion diff --git a/webinterface/minibase/users/routes.py b/webinterface/minibase/users/routes.py index cf2d1593..608aea36 100644 --- a/webinterface/minibase/users/routes.py +++ b/webinterface/minibase/users/routes.py @@ -2,7 +2,7 @@ from flask import render_template, url_for, flash, redirect, request, Blueprint from flask_login import login_user, current_user, logout_user, login_required from minibase import db, bcrypt from minibase.config import themeMinibase -from minibase.models import User, Post +from minibase.database.models import User, Post from minibase.users.forms import (registrationForm, loginForm, updateAccountForm, requestResetForm, resetPasswordForm) from minibase.users.utils import save_picture, send_reset_email diff --git a/webinterface/prepare.py b/webinterface/prepare.py new file mode 100644 index 00000000..e9168e80 --- /dev/null +++ b/webinterface/prepare.py @@ -0,0 +1,134 @@ +from minibase import db, create_minibase +from minibase.database.models import Person, Person_role, Person_competence +from minibase.database.models import Company, Company_relation, Company_legal_entity +from minibase.database.models import Status, Industry + +app = create_minibase() +app.app_context().push() +db.drop_all() +db.create_all() + + +################################################################################################### +PeresonRole1 = Person_role( + name='Engineer', + description='Standart Engineer') +db.session.add(PeresonRole1) + +PeresonRole2 = Person_role( + name='Engineerin Manager', + description='Manager for egineering') +db.session.add(PeresonRole2) + +db.session.commit() + +PeresonRole3 = Person_role( + name='CEO', + description='Chief Executif Operation') +db.session.add(PeresonRole1) + +PersonCompethence1 = Person_competence( + name='Embedded Systems', + description='Embedded Systems Engineer') +db.session.add(PersonCompethence1) + +PersonCompethence2 = Person_role( + name='hardware', + description='Electronics Hardwre specialist') +db.session.add(PersonCompethence2) + +PersonCompethence3 = Person_role( + name='Software', + description='Software engineer') +db.session.add(PersonCompethence1) + + +################################################################################################### +industry1 = Industry( + name='Industrial', + description="Active in Industrial area") +db.session.add(industry1) + +industry2 = Industry( + name='Consumer', + description="Active in Consumer area") +db.session.add(industry1) + +companyRelation1 = Company_relation( + name='Customer', + description="Only Buyiong customer") +db.session.add(companyRelation1) + +companyRelation2 = Company_relation( + name='Supplier', + description="Only Selling customer") +db.session.add(companyRelation2) + +companyRelation3 = Company_relation( + name='Collaborator', + description="Buying and Selling customer") +db.session.add(companyRelation2) + +companyLegal1 = Company_legal_entity( + name='AG', + description='AktienGezelschaft') +db.session.add(companyLegal1) + +companyLegal2 = Company_legal_entity( + name='GMBH', + description='Gesellschaft mit beschränkter Haftung') +db.session.add(companyLegal2) + +################################################################################################### +status1 = Status( + name='Obsolete', + description='Obsolete from Manufacturer') +db.session.add(status1) + +status2 = Status( + name='Active', + description='Everything is in order') +db.session.add(status2) + +################################################################################################### +company1 = Company( + name='Steinel', + legal_entity_id='1', + relation_id='1', + industry_id='1', + website='www.steinel.ch', + street_bill='Alemeinrstrasse', + street_no_bill='10', + city_bill='Einsiedeln', + post_code_bill='8406', + state_bill='Schyz', + country_bill='Switzerland', + street_ship='Alemeinrstrasse', + street_no_ship='10', + city_ship='Einsiedeln', + post_code_ship='8406', + state_ship='Schyz', + country_ship='Switzerland') +db.session.add(company1) + +company2 = Company( + name='Kynsight', + legal_entity_id='1', + relation_id='1', + industry_id='1', + website='www.kynsight.com', + street_bill='Meierackerstrasse', + street_no_bill='10', + city_bill='Uster', + post_code_bill='8610', + state_bill='Zürich', + country_bill='Switzerland', + street_ship='Meierackerstrasse', + street_no_ship='10', + city_ship='Uster', + post_code_ship='8610', + state_ship='Zürich', + country_ship='Switzerland') +db.session.add(company2) + +db.session.commit() diff --git a/webinterface/run.py b/webinterface/run.py index 6634dd12..9ff020bc 100644 --- a/webinterface/run.py +++ b/webinterface/run.py @@ -1,7 +1,10 @@ from minibase import create_minibase +from minibase.database import models + # Enable debug option even if run directly form Python3 app = create_minibase() if __name__ == '__main__': app.run(debug=True) + app.db.create_all()