Exemplo n.º 1
0
 def get_agencies(cls, truncate=True):
     """
     Get a list of agencies
     """
     with Lock("agencies"):
         request_params = {
             'command': 'agencyList',
         }
         agencies_xml, api_call = cls.request(request_params, 'agency')
         if not agencies_xml:
             return []
         db.session.begin()
         if truncate:
             db.session.query(Agency).delete()
         agencies = []
         for agency in agencies_xml:
             region = Region.get_or_create(db.session,
                                           title=agency.get('regionTitle'))
             a = Agency.get_or_create(db.session,
                                      tag=agency.get('tag'),
                                      title=agency.get('title'),
                                      short_title=agency.get('shortTitle'),
                                      region=region,
                                      api_call=api_call)
             agencies.append(a)
         db.session.commit()
         return agencies
Exemplo n.º 2
0
 def get_agencies(cls, truncate=True):
     """
     Get a list of agencies
     """
     with Lock("agencies"):
         request_params = {
             'command': 'agencyList',
         }
         agencies_xml, api_call = cls.request(request_params, 'agency')
         if not agencies_xml:
             return []
         db.session.begin()
         if truncate:
             db.session.query(Agency).delete()
         agencies = []
         for agency in agencies_xml:
             region = Region.get_or_create(db.session,
                 title=agency.get('regionTitle'))
             a = Agency.get_or_create(db.session,
                 tag = agency.get('tag'),
                 title = agency.get('title'),
                 short_title = agency.get('shortTitle'),
                 region = region,
                 api_call = api_call)
             agencies.append(a)
         db.session.commit()
         return agencies
def agencyAuthController():

    errorString = ''

    if ('agency' in session):
        return redirect(url_for('agency_panel'))

    if request.method == 'POST' and ('email'
                                     in request.form) and ('password'
                                                           in request.form):
        if request.form['email'] and request.form['password']:
            hash = hashlib.sha256(
                request.form['password'].encode()).hexdigest().upper()
            currentUser = Agency.objects(email=request.form['email'],
                                         password=hash).first()
            if currentUser:
                if currentUser.active == 1:
                    session['agency'] = currentUser
                    return redirect(url_for('agency_panel'))
                else:
                    errorString = "Your account is not active"
            else:
                errorString = "Wrong data, unable to execute login"
        else:
            errorString = "Please insert username and password"

    return render_template('auth/login_agency.html', errorString=errorString)
Exemplo n.º 4
0
def tagcloud(request):
    # get agencies sorted by contract_value
	query = Agency.all().order("name")
	agencies = []
	for agency in query:
	    agency.weight = utils.tag_weight(agency.contract_value)
	    agencies.append(agency)
	return render_to_response('tagcloud.html', { 'agencies': agencies })
Exemplo n.º 5
0
def load_agencies(request, indexfile=""):

    #Open summary excelfile
    wbin = xlrd.open_workbook(indexfile)

    #Agencies
    sh_source = wbin.sheet_by_name(u'Agencies')
    for rownum in range(1,sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname  = row[0]
        fullname   = row[1]
        parentname = row[2]
        website    = row[3]
        scraped    = True
        newagency = Agency(shortname=shortname, name=fullname, parentname=parentname,
                           website=website, notes="", scraped=scraped)
        newagency.save()
    return HttpResponse("Agency details loaded from file.")
Exemplo n.º 6
0
    def agencies_and_routes(self):
        all_routes = {}
        for agency in Agency.get_or_fetch().iteritems():
            agency_tag = agency[0]
            agency_model_dict = agency[1].to_dict()
            agency_model_dict.setdefault("routes", []).append(Route.get_or_fetch(agency_tag))
            all_routes[agency_tag] = agency_model_dict

        return formatter.JSON(all_routes)
Exemplo n.º 7
0
def create_tables():
    # delete old records
    Base.metadata.drop_all(engine)
    #
    Base.metadata.create_all(engine)
    #
    for agency in agencies:
        a = Agency(abbreviation=agency, full_name=agencies[agency])
        session.add(a)
        session.commit()
Exemplo n.º 8
0
def signup(username, password) -> Tuple[Agency, Signer_Impl]:
    try:
        signer = create_account(username, password)

        agency = Agency(username = username, password = password)

        contract_addr = deploy_contract("Agency", signer = signer)
        agency.contract_addr = contract_addr
        agency.account_addr = str(signer.keypair.address)
        agency.account_pub = str(signer.keypair.public_key)
        agency.account_priv = str(signer.keypair.private_key)

        privkey, pubkey = gen_rsakey()
        agency.envelope_pub = pubkey
        agency.envelope_priv = privkey

        managementAddr = db.session.query(Contracts).filter(Contracts.name == "Management").first().addr
        EngineerListAddr = db.session.query(Contracts).filter(Contracts.name == "EngineerList").first().addr
        creditAddr = db.session.query(Contracts).filter(Contracts.name == "Credit").first().addr

        call_contract(contract_addr, "Agency", "setEngListAddr", args = [to_checksum_address(EngineerListAddr)], signer = signer)
        call_contract(contract_addr, "Agency", "setCreditAddr", args = [to_checksum_address(creditAddr)], signer = signer)
        agency.engineer_list_addr = EngineerListAddr

        # call_contract2(managementAddr, "Management", "addAgency", 
        #     args = [
        #         username, 
        #         to_checksum_address(agency.account_addr),
        #         to_checksum_address(agency.contract_addr),
        #         agency.envelope_pub, "" ], signer = signer)

    
        call_contract(managementAddr, "Management", "addAgency", 
            args = [
                username, 
                to_checksum_address(agency.account_addr),
                to_checksum_address(agency.contract_addr),
                agency.envelope_pub, ""], signer = signer)

        db.session.add(agency)
        db.session.commit()
    except Exception:
        traceback.print_exc()
        db.session.rollback()
        return None, None
    return agency, signer
Exemplo n.º 9
0
def load_agencies(request, indexfile=""):

    #Open summary excelfile
    wbin = xlrd.open_workbook(indexfile)

    #Agencies
    sh_source = wbin.sheet_by_name(u'Agencies')
    for rownum in range(1, sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        parentname = row[2]
        website = row[3]
        scraped = True
        newagency = Agency(shortname=shortname,
                           name=fullname,
                           parentname=parentname,
                           website=website,
                           notes="",
                           scraped=scraped)
        newagency.save()
    return HttpResponse("Agency details loaded from file.")
Exemplo n.º 10
0
	def get(self):
		profile = Profile.get_or_create()
		assert profile is not None
		
		agencies = Agency.query(Agency.enabled == True)
		if agencies.count(limit=1) < 1:
			agencies = None

		context = dict(
			object_list=agencies,
			report_count=StopReport.query(StopReport.user == profile.key).count(limit=100),
		)
		self.render_to_response('agency_list.html', context)
Exemplo n.º 11
0
	def get(self, agency_id):
		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None:
				return send_404(self)
		except:
			return send_404(self)

		agency_vehicle_types = list(agency.vehicle_types)
		agency_vehicle_types.sort()
		agency_vehicle_types = [(x, VEHICLE_TYPES[x]) for x in agency_vehicle_types]
		
		context = dict(
			agency_name=agency.name,
			vehicle_types=agency_vehicle_types,
		)
		self.render_to_response('agency_detail.html', context)
Exemplo n.º 12
0
	def get(self, agency_id):
		user = users.get_current_user()
		if not user or not users.is_current_user_admin():
			return

		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None:
				return self.send_404()
		except:
			return self.send_404()

		context = dict(
			agency_name=agency.name,
			vehicle_types=VEHICLE_TYPES.keys(),
		)
		
		self.render_to_response('agency_stops_import.html', context)
Exemplo n.º 13
0
	def get(self, agency_id, vehicle):
		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None or vehicle not in VEHICLE_TYPES or vehicle not in agency.vehicle_types:
				return self.send_404()
		except:
			return self.send_404()

		# Check for known stops
		known_stops = list(Stop.query(Stop.stop_type == vehicle, Stop.agency == agency.key).order(Stop.name))

		context = dict(
			agency_name=agency.name,
			agency_id=agency.key.id(),
			vehicle=vehicle,
			known_stops=known_stops,
		)
		self.render_to_response('agency_report.html', context)
Exemplo n.º 14
0
	def post(self, agency_id):
		user = users.get_current_user()
		if not user or not users.is_current_user_admin():
			return

		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None:
				return self.send_404()
		except:
			return self.send_404()

		vehicle_types = [x.strip().lower() for x in self.request.get('vehicle_types').split(',')]
		vehicle_types = [x for x in vehicle_types if x in VEHICLE_TYPES.keys()]
		agency.vehicle_types = vehicle_types
		agency.put()

		context = dict(
			agency_name=agency.name,
			agency=agency,
			vehicle_types=VEHICLE_TYPES.keys(),
		)
		
		self.render_to_response('agency_edit.html', context)
Exemplo n.º 15
0
def create(request):
    try:
        json_obj = commonHttp.get_json(request.body)

        req_attrs = [
            expectedAttr["NAME"], expectedAttr["DESCRIPTION"],
            expectedAttr["SMS_CONTACT_NO"]
        ]

        commonHttp.check_keys(json_obj, req_attrs)

        new_agency = Agency(
            name=json_obj[expectedAttr["NAME"]],
            description=json_obj[expectedAttr["DESCRIPTION"]],
            sms_contact_no=json_obj[expectedAttr["SMS_CONTACT_NO"]])

        commonHttp.save_model_obj(new_agency)

        response = JsonResponse({"id": new_agency.id, "success": True})

        return response

    except commonHttp.HttpBadRequestException as e:
        return HttpResponseBadRequest(e.reason_phrase)
Exemplo n.º 16
0
def contract_count():
	agencies = Agency.all().fetch(200)
	count = 0
	for agency in agencies:
	    count += agency.contract_count
	return count
Exemplo n.º 17
0
 def agency(self, agency_tag):
     return formatter.JSON(Agency.properties(agency_tag))
Exemplo n.º 18
0
	def post(self, agency_id):
		user = users.get_current_user()
		if not user or not users.is_current_user_admin():
			return

		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None:
				return self.send_404()
		except:
			return self.send_404()

		error_msg = None
		ok_msg = None

		# Process the upload
		upload = self.request.POST['upload']
		if upload.file:
			upload_csv = csv.reader(upload.file)
			header = upload_csv.next()
			
			name_f = header.index('name')
			stop_type_f = header.index('stop_type')
			try:
				stop_id_f = header.index('stop_id')
			except:
				stop_id_f = None
			try:
				stop_code_f = header.index('stop_code')
			except:
				stop_code_f = None
			try:
				y_f = header.index('y')
				x_f = header.index('x')
			except:
				y_f = x_f = None
			
			# Start reading rows
			stop_count = 0
			for row in upload_csv:
				name = row[name_f].strip()
				stop_type = row[stop_type_f].strip()
				if stop_type not in VEHICLE_TYPES.keys():
					error_msg = 'stop type invalid (%r)' % (stop_type,)
					break
				try:
					stop_code = row[stop_code_f].strip()
				except:
					stop_code = None
				try:
					stop_id = row[stop_id_f].strip()
				except:
					stop_id = None
				try:
					x = float(row[x_f].strip())
					y = float(row[y_f].strip())
				except:
					x_f = y_f = None
				if x_f is not None:
					point = ndb.GeoPt(y, x)
				else:
					point = None
				
				stop = Stop(
					name=name,
					stop_type=stop_type,
					agency=agency.key,
					gtfs_stop_id=stop_id,
					gtfs_stop_code=stop_code,
					gtfs_point=point,
				)
				stop.put()
				stop_count += 1
			ok_msg = 'imported %d stop(s)' % stop_count
		else:
			error_msg = 'cannot open uploaded file'

		context = dict(
			agency_name=agency.name,
			vehicle_types=VEHICLE_TYPES.keys(),
			error_msg=error_msg,
			ok_msg=ok_msg,
		)
		
		self.render_to_response('agency_stops_import.html', context)
Exemplo n.º 19
0
def load_indicator_spreadsheet(request, indexfile=""):

    #Open summary excelfile
    wbin = xlrd.open_workbook(indexfile)

    #Agencies
    sh_source = wbin.sheet_by_name(u'Agencies')
    for rownum in range(1,sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname  = row[0]
        fullname   = row[1]
        parentname = row[2]
        website    = row[3]
        scraped    = True
        newagency = Agency(shortname=shortname, name=fullname, parentname=parentname,
                           website=website, notes="", scraped=scraped)
        newagency.save()
    
    #Datasources
    sh_source = wbin.sheet_by_name(u'Datasources Used')
    for rownum in range(1,sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        sourceagency = row[2]
        sourcefile = row[5]
        sourceurl = row[7]
        #FIXIT: should be the times when scrapers were run, not the date the file
        #was uploaded
        todaysdate = datetime.now() 
        newsource = Datasource(shortname=shortname, name=fullname, notes="",
                               url=sourceurl,
                               dateadded=todaysdate, datechecked=todaysdate,
                               scraper=True, localfile=sourcefile)
        newsource.save()
        
    sh_source = wbin.sheet_by_name(u'Suggested Sources')
    for rownum in range(1,sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        sourceagency = row[2]
        sourceurl = row[3]
        newsource = Datasource(shortname=shortname, name=fullname, notes="",
                               url=sourceurl,
                               dateadded=todaysdate, datechecked=todaysdate,
                               scraper=False, localfile="")
        newsource.save()
        
    #Indicators
    indicators = {}
    sh_ind = wbin.sheet_by_name(u'Indicators Needed')
    for rownum in range(1,sh_ind.nrows):
        row = sh_ind.row_values(rownum)
        indcode = row[0]
        indname = row[1]
        indicators[indcode] = indname
##        newindicator = Indicator()
##        newindicator.save()

    #Indicators in sources
    found = {}
    sh_found = wbin.sheet_by_name(u'Indicators Found')
    for rownum in range(1,sh_found.nrows):
        row = sh_found.row_values(rownum)
        sourcecode = row[0]
        indcode = row[1]
        csvheading = row[4]
        #Only process indicators that we have data for
        if not(csvheading == ""):
            if not(found.has_key(sourcecode)):
                found[sourcecode] = {}
            found[sourcecode][csvheading] = indcode
##        newfound = foundIndicator(indicator=, datasource=,
##                                  csvfile=, csvindname=,
##                                  datasourceindname=,
##                                  datasourcedesc=, notes=)
##        newfound.save()
    
    return HttpResponse("Indicator details loaded from file.")
Exemplo n.º 20
0
def employeeAgencyController(action=None, resourceId=None):

    #keep non-logged users outside

    if ('employee' not in session) or (session['employee']['superAdmin']
                                       is not True):
        return redirect(url_for('backoffice_auth'))

    #check resourceId validity
    agencyData = None

    if resourceId is not None:
        if ObjectId.is_valid(str(resourceId)):
            agencyData = Agency.objects(id=ObjectId(str(resourceId))).first()
            if not agencyData:
                return render_template(
                    '404.html', errorString="This Agency does not exist")
        else:
            return render_template('404.html',
                                   errorString="This AgencyID is not valid")

    errorString = ''
    agencyList = []
    validationErrors = []
    pageTitle = ""

    #switch action cases (add,edit,delete,list)

    if action == 'add' or action == 'edit':

        pageTitle = "Add Agency" if action == "add" else "Edit Agency"
        templatePath = 'agencies/add.html'

        if request.method == 'POST' and ('submit' in request.form):
            #validate username

            if 'email' in request.form:
                if not request.form['email']:
                    validationErrors.append("Field email is empty")
                else:
                    if not request.form['email'].find("@"):
                        validationErrors.append(
                            "Email field should contain at least one @")
                    if action == 'add':
                        if len(Agency.objects(
                                email=request.form['email'])) > 0:
                            validationErrors.append(
                                "The email you've choose already exists")
                    else:
                        if len(
                                Agency.objects(
                                    email=request.form['email'],
                                    email__ne=agencyData.email)) > 0:
                            validationErrors.append(
                                "The email you've choose already exists")
            else:
                validationErrors.append("Missing field email in request")

            #validate companyName
            if 'companyName' in request.form:
                if not request.form['companyName']:
                    validationErrors.append("Field companyName is empty")
            else:
                validationErrors.append("Missing field companyName in request")

            #validate phone
            if 'phone' in request.form:
                if not request.form['phone']:
                    validationErrors.append("Field phone is empty")
            else:
                validationErrors.append("Missing field phone in request")

            #validate phone
            if 'VAT' in request.form:
                if not request.form['VAT']:
                    validationErrors.append("Field VAT is empty")
            else:
                validationErrors.append("Missing field VAT in request")

            city = ''
            district = ''
            address = ''

            if 'city' in request.form:
                city = request.form['city']
            if 'district' in request.form:
                district = request.form['district']
            if 'address' in request.form:
                address = request.form['address']

            #validate password

            if 'password' in request.form:
                if not request.form['password']:
                    if (action == 'edit'):
                        hash = agencyData.password  #keep old password
                    else:
                        validationErrors.append("Field password is empty")
                else:
                    if len(request.form['password']) < 8:
                        validationErrors.append(
                            "Password field should be min. 8 chars")
                    else:
                        hash = hashlib.sha256(request.form['password'].encode(
                        )).hexdigest().upper()  #make new hash
            else:
                validationErrors.append("Missing field password in request")

            #validate active

            if len(validationErrors) == 0:
                #save

                if action == 'add':
                    result = Agency(
                        companyName=str(request.form['companyName']),
                        city=str(city),
                        district=str(district),
                        address=str(address),
                        email=str(request.form['email']),
                        phone=str(request.form['phone']),
                        profitRate=float(request.form['profitRate']),
                        VAT=str(request.form['VAT']),
                        password=hash,
                        active=(True if int(request.form['active']) == 1 else
                                False)).save()
                    if result:
                        lastAgency = Agency.objects(
                            email=request.form['email']).first()
                        return redirect(
                            url_for('agencies',
                                    action='edit',
                                    resourceId=lastAgency.id))
                    else:
                        validationErrors.append("Unable to write this record")

                else:
                    result = Agency.objects(email=agencyData['email']).update(
                        companyName=str(request.form['companyName']),
                        city=str(city),
                        district=str(district),
                        address=str(address),
                        email=str(request.form['email']),
                        phone=str(request.form['phone']),
                        profitRate=float(request.form['profitRate']),
                        VAT=str(request.form['VAT']),
                        password=hash,
                        active=(True if int(request.form['active']) == 1 else
                                False))
                    return redirect(
                        url_for('agencies',
                                action='edit',
                                resourceId=resourceId))

            else:
                errorString = '|'.join(validationErrors)

    elif action == 'delete':
        pageTitle = "Agencies"
        templatePath = 'agencies/list.html'
        Agency.objects(id=ObjectId(str(resourceId))).delete()
        agencyList = Agency.objects().order_by('companyName')

    else:
        pageTitle = "Agencies"
        templatePath = 'agencies/list.html'
        agencyList = Agency.objects().order_by('companyName')

    return render_template(templatePath,
                           pageTitle=pageTitle,
                           employee=session['employee'],
                           userType='employee',
                           errorString=errorString,
                           agencyList=agencyList,
                           agencyData=agencyData,
                           action=action,
                           resourceId=resourceId)
Exemplo n.º 21
0
def load_indicator_spreadsheet(request, indexfile=""):

    #Open summary excelfile
    wbin = xlrd.open_workbook(indexfile)

    #Agencies
    sh_source = wbin.sheet_by_name(u'Agencies')
    for rownum in range(1, sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        parentname = row[2]
        website = row[3]
        scraped = True
        newagency = Agency(shortname=shortname,
                           name=fullname,
                           parentname=parentname,
                           website=website,
                           notes="",
                           scraped=scraped)
        newagency.save()

    #Datasources
    sh_source = wbin.sheet_by_name(u'Datasources Used')
    for rownum in range(1, sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        sourceagency = row[2]
        sourcefile = row[5]
        sourceurl = row[7]
        #FIXIT: should be the times when scrapers were run, not the date the file
        #was uploaded
        todaysdate = datetime.now()
        newsource = Datasource(shortname=shortname,
                               name=fullname,
                               notes="",
                               url=sourceurl,
                               dateadded=todaysdate,
                               datechecked=todaysdate,
                               scraper=True,
                               localfile=sourcefile)
        newsource.save()

    sh_source = wbin.sheet_by_name(u'Suggested Sources')
    for rownum in range(1, sh_source.nrows):
        row = sh_source.row_values(rownum)
        shortname = row[0]
        fullname = row[1]
        sourceagency = row[2]
        sourceurl = row[3]
        newsource = Datasource(shortname=shortname,
                               name=fullname,
                               notes="",
                               url=sourceurl,
                               dateadded=todaysdate,
                               datechecked=todaysdate,
                               scraper=False,
                               localfile="")
        newsource.save()

    #Indicators
    indicators = {}
    sh_ind = wbin.sheet_by_name(u'Indicators Needed')
    for rownum in range(1, sh_ind.nrows):
        row = sh_ind.row_values(rownum)
        indcode = row[0]
        indname = row[1]
        indicators[indcode] = indname
##        newindicator = Indicator()
##        newindicator.save()

#Indicators in sources
    found = {}
    sh_found = wbin.sheet_by_name(u'Indicators Found')
    for rownum in range(1, sh_found.nrows):
        row = sh_found.row_values(rownum)
        sourcecode = row[0]
        indcode = row[1]
        csvheading = row[4]
        #Only process indicators that we have data for
        if not (csvheading == ""):
            if not (found.has_key(sourcecode)):
                found[sourcecode] = {}
            found[sourcecode][csvheading] = indcode
##        newfound = foundIndicator(indicator=, datasource=,
##                                  csvfile=, csvindname=,
##                                  datasourceindname=,
##                                  datasourcedesc=, notes=)
##        newfound.save()

    return HttpResponse("Indicator details loaded from file.")
Exemplo n.º 22
0
def tagcloud(request):
    # get agencies sorted by contract_value
	agencies = Agency.all().order("name").fetch(200)
	return render_to_response('tagcloud.html', { 'agencies': agencies })
Exemplo n.º 23
0
 def agencies(self):
     return formatter.JSON(Agency.get_or_fetch())
Exemplo n.º 24
0
	def post(self):
		profile = Profile.get_or_create()
		assert profile is not None

		agency_id = self.request.get('agency_id')
		vehicle = self.request.get('vehicle')
		card_id = self.request.get('card_id')
		known_stop = self.request.get('known_stop')
		stop_name = self.request.get('stop_name')
		comment = self.request.get('comment')

		# Start validation!
		# Check agency
		try:
			agency = Agency.get_by_id(int(agency_id))
			if agency is None or not agency.enabled:
				# Invalid agency
				return self.send_404()
		except:
			return self.send_404()

		# Check vehicle type
		if vehicle not in VEHICLE_TYPES or vehicle not in agency.vehicle_types:
			return self.send_404()

		# Check card id
		try:
			card_id = int(card_id)
		except:
			# invalid card id, not a number.
			return self._retry_form(agency, vehicle, card_id, known_stop, stop_name, comment, 'Card ID is not a number')

		# Check known_stop
		if known_stop != '':
			try:
				known_stop = Stop.get_by_id(int(known_stop))
				if known_stop.agency.id() != agency.key.id():
					# stop is not for agency
					known_stop = None
			except:
				
				known_stop = None
		
		if known_stop is None:
			# Invalid stop
			return self._retry_form(agency, vehicle, card_id, known_stop, stop_name, comment, 'Stop ID is not valid')

		if known_stop == '':
			known_stop = None

		# Check stop_name is present if known_stop is not
		if known_stop is None and stop_name == '':
			# Custom name not specified and no known stop selected.
			return self._retry_form(agency, vehicle, card_id, known_stop, stop_name, comment, 'No stop name was entered')

		# If the user is banned, then say we processed the report, but don't
		# actually store it anywhere.
		if not profile.banned:
			# Now get the extra metadata and make the report
			country = self.request.headers.get('x-appengine-country', 'XX')
			region = self.request.headers.get('x-appengine-region', '')
			city = self.request.headers.get('x-appengine-city', '')
			ip = self.request.remote_addr
		
			report = StopReport(
				agency=agency.key,
				stop=known_stop.key if known_stop else None,
				name=stop_name,
				stop_type=vehicle,
				card_id=str(card_id),
				comment=comment,
				gae_country=country,
				gae_region=region,
				gae_city=city,
				gae_ip=ip,
				user=profile.key
			)
			report.put()
		
		context = dict(
			agency_name=agency.name,
			agency_id=agency.key.id(),
		)
		self.render_to_response('report_sent.html', context)
Exemplo n.º 25
0
def construct_Agency():
   agency_list =  [Agency(name = u_agency) for u_agency in list(set([row['agency'] for index, row in complete_data2.iterrows()]))]
   db.session.add_all(agency_list)
   db.session.commit()
def agencyReservationController(action=None, resourceId=None, config={}):

    #keep non-logged users outside

    if ('agency' not in session):
        return redirect(url_for('agency_auth'))

    #check resourceId validity
    reservationData = None
    if resourceId:
        if ObjectId.is_valid(str(resourceId)):
            reservationData = Reservation.objects(
                id=ObjectId(str(resourceId)),
                agency=ObjectId(str(
                    session['agency']['_id']['$oid']))).first()
            if not reservationData:
                return render_template(
                    '404.html', errorString="This Reservation does not exist")
            else:
                if str(session['agency']['_id']['$oid']) != str(
                        reservationData.agency):
                    return render_template(
                        '404.html',
                        errorString="You do not have access to this page")
        else:
            return render_template('404.html',
                                   errorString="This ParkingID is not valid")

    errorString = ''
    parkingList = []
    validationErrors = []
    pageTitle = ""
    reservationList = []
    agencyList = []
    counters = {"reservations": 0, "earned": 0, "agencyProfit": 0}

    #switch action cases (add,edit,delete,list)

    if action == 'add' or action == 'edit':

        pageTitle = "Add Reservation" if action == "add" else "Edit Reservation"
        templatePath = 'reservations/add_agency.html'
        parkingList = Parking.objects().order_by('name')

        if request.method == 'POST' and ('submit' in request.form):
            #return render_template("404.html",errorString=datetime.strptime("2019-02-01 15:26", '%Y-%m-%d %H:%M').isoformat())
            #validation

            #validate name
            if 'name' in request.form:
                if not request.form['name']:
                    validationErrors.append("Field name is empty")
            else:
                validationErrors.append("Missing field name in request")

            #validate surname
            if 'surname' in request.form:
                if not request.form['surname']:
                    validationErrors.append("Field surname is empty")
            else:
                validationErrors.append("Missing field surname in request")

            #validate email
            if 'email' in request.form:
                if not request.form['email'] or not request.form['email'].find(
                        "@"):
                    validationErrors.append("Field email is empty or invalid")
            else:
                validationErrors.append("Missing field email in request")

            #validate parking

            relatedParking = None
            if 'parking' in request.form:

                #request.form['relatedParking']
                if request.form['parking'] and ObjectId.is_valid(
                        str(request.form['parking'])):
                    if not Parking.objects(
                            id=ObjectId(str(request.form['parking']))).first():
                        validationErrors.append(
                            "The parking you are referencing is not existing")
                    else:
                        relatedParking = ObjectId(str(request.form['parking']))
                else:
                    validationErrors.append(
                        "The parking you are referencing is not valid")
            else:
                validationErrors.append("Missing parking reference in request")

            #validate agency

            relatedAgency = ObjectId(session['agency']['_id']['$oid'])

            #validate dates
            fromDate = None
            toDate = None
            if 'fromDate' in request.form:
                if not request.form['fromDate']:
                    validationErrors.append("Field fromDate is empty")
                else:
                    try:
                        fromDate = datetime.strptime(request.form['fromDate'],
                                                     '%Y-%m-%d %H:%M')
                    except:
                        validationErrors.append("Field fromDate is empty")

            else:
                validationErrors.append("Missing field fromDate in request")

            if 'toDate' in request.form:
                if not request.form['toDate']:
                    validationErrors.append("Field toDate is empty")
                else:
                    try:
                        toDate = datetime.strptime(request.form['toDate'],
                                                   '%Y-%m-%d %H:%M')
                    except:
                        validationErrors.append("Field toDate is empty")

            else:
                validationErrors.append("Missing field fromDate in request")

            #non-mandatory fields
            model = ""
            plate = ""
            type = "car"
            paymentType = "online"
            amount = 0
            agencyProfit = 0

            if 'model' in request.form:
                model = request.form['model']
            if 'plate' in request.form:
                plate = request.form['plate']
            if 'type' in request.form:
                type = ("car"
                        if str(request.form['type']) == "car" else "moto")
            if 'paymentType' in request.form:
                paymentType = ("online" if str(request.form['paymentType'])
                               == "online" else "onsite")

            if fromDate and toDate:
                #check date difference
                dateDiff = toDate - fromDate
                reservationHours = dateDiff.total_seconds() / 3600
                if reservationHours <= 0:
                    validationErrors.append(
                        "Distance between starting and ending date should be 1 hour"
                    )

            if len(validationErrors) == 0:

                #proceed calculating amount and (if needed) agencyProfit

                selectedParking = Parking.objects(id=relatedParking).first()
                amount = decimal.Decimal(
                    reservationHours) * selectedParking['pricePerHour']

                if relatedAgency:
                    #calc profit
                    selectedAgency = Agency.objects(id=relatedAgency).first()
                    agencyProfit = selectedAgency['profitRate'] * amount / 100

                if action == 'add':
                    executionDate = datetime.now()
                    result = Reservation(
                        status="CONFIRMED",
                        user={
                            'name': request.form['name'],
                            'surname': request.form['surname'],
                            'email': request.form['email'],
                            'model': model,
                            'plate': plate,
                            'type': type
                        },
                        fromDate=fromDate.isoformat(),
                        toDate=toDate.isoformat(),
                        parking=relatedParking,
                        amount=amount,
                        paymentType=paymentType,
                        agencyProfit=agencyProfit,
                        agency=relatedAgency,
                        executionDate=executionDate.isoformat()).save()
                    if result:
                        try:
                            server = smtplib.SMTP(
                                config['SMTP_CONFIG']['HOST'],
                                config['SMTP_CONFIG']['PORT'])
                            server.starttls()
                            server.login(config['SMTP_CONFIG']['LOGIN'],
                                         config['SMTP_CONFIG']['PASSWORD'])
                            to = str(request.form['email'])
                            msg = MIMEMultipart()
                            msg['From'] = config['SMTP_CONFIG']['SEND_FROM']
                            msg['To'] = to
                            msg['Subject'] = "Well done! Parking reservation confirm"
                            body = "<p>Dear " + escape(
                                request.form['name'] + " " +
                                request.form['surname']
                            ) + ",<br>this is your booking:<ul>\
                            <li>Code : " + str(result.id) + "</li>\
                            <li>Execution : " + executionDate.strftime(
                                '%d/%m/%Y %H:%M') + "</li>\
                            <li>From : " + fromDate.strftime(
                                    '%d/%m/%Y %H:%M') + "</li>\
                            <li>To : " + toDate.strftime(
                                        '%d/%m/%Y %H:%M') + "</li>\
                            <li>Amount : &euro;" + str(amount) + "</li>\
                            <li>Parking : " + escape(str(
                                            selectedParking.name)) + "</li>\
                            <li>Parking Address : " + escape(
                                                str(selectedParking.address) +
                                                "," +
                                                str(selectedParking.city) +
                                                " " + str(selectedParking.
                                                          district)) + "</li>\
                            </ul><br><br>Best regards,<br><b>eparkingsystem</b></p>\
                            "

                            msg.attach(MIMEText(body, 'html'))
                            text = msg.as_string()
                            server.sendmail(config['SMTP_CONFIG']['SEND_FROM'],
                                            to, text)
                            server.quit()
                        except:
                            pass

                        return redirect(url_for('agency_reservations'))
                    else:
                        validationErrors.append("Unable to write this record")
                else:
                    result = Reservation.objects(
                        id=ObjectId(str(resourceId))).update(
                            status="CONFIRMED",
                            user={
                                'name': request.form['name'],
                                'surname': request.form['surname'],
                                'email': request.form['email'],
                                'model': model,
                                'plate': plate,
                                'type': type
                            },
                            fromDate=fromDate.isoformat(),
                            toDate=toDate.isoformat(),
                            parking=relatedParking,
                            amount=amount,
                            paymentType=paymentType,
                            agencyProfit=agencyProfit,
                            agency=relatedAgency,
                            executionDate=datetime.now().isoformat())

                    return redirect(
                        url_for('agency_reservations',
                                action='edit',
                                resourceId=resourceId))

            else:
                errorString = '|'.join(validationErrors)

    elif action == 'delete':
        Reservation.objects(
            id=ObjectId(str(resourceId)),
            agency=ObjectId(str(session['agency']['_id']['$oid']))).delete()
        return redirect(url_for('agency_reservations'))

    else:
        pageTitle = "Reservations"
        templatePath = 'reservations/list.html'
        objectList = Reservation.objects(agency=ObjectId(
            str(session['agency']['_id']['$oid']))).order_by("-executionDate")

        reservationList = objectList.aggregate(*[{
            "$lookup": {
                "from": "parkings",
                "localField": "parking",
                "foreignField": "_id",
                "as": "parkingData"
            }
        }, {
            "$lookup": {
                "from": "agencies",
                "localField": "agency",
                "foreignField": "_id",
                "as": "agencyData"
            }
        }, {
            "$unwind": "$parkingData"
        }, {
            "$unwind": "$agencyData"
        }, {
            "$project": {
                "_id": 1,
                "status": 1,
                "user": 1,
                "fromDate": 1,
                "toDate": 1,
                "parking": 1,
                "amount": 1,
                "paymentType": 1,
                "agencyProfit": 1,
                "agency": 1,
                "executionDate": 1,
                "parkingName": "$parkingData.name",
                "agencyCompanyName": "$agencyData.companyName",
            }
        }])
        #get counters value
        counters['reservations'] = objectList.count()
        counters['agencyProfit'] = 0
        counters['earned'] = objectList.sum("agencyProfit")

    return render_template(templatePath,
                           pageTitle=pageTitle,
                           agency=session['agency'],
                           userType='agency',
                           errorString=errorString,
                           parkingList=parkingList,
                           agencyList=agencyList,
                           reservationList=reservationList,
                           reservationData=reservationData,
                           action=action,
                           resourceId=resourceId,
                           counters=counters)
Exemplo n.º 27
0
def _create_agency(agency_data, source_application):
	agency = Agency()
	agency.build(agency_data)
	agency.source_application = source_application
	return agency.find_or_create()