def datashop(): from shops import Shop, DomainShop, ContractedProduct, Product from invoices import Order Shop(db), DomainShop(db), ContractedProduct(db), Product(db), Order(db) #store=db((db.shop.user==auth.user_id) & (db.shop.host==request.vars.host)).select() stores = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select( db.shop.ALL, db.domainshops.ALL, db.priceplans.ALL, left=[ db.domainshops.on(db.domainshops.shop == db.shop.id), db.priceplans.on(db.priceplans.id == db.shop.priceplan) ]) contractedproducts = db( (db.contractedproducts.user == auth.user_id) & (db.contractedproducts.shop == stores[0].shop) & (db.contractedproducts.expiration <= datetime.datetime.now())).select( db.contractedproducts.ALL, db.products.ALL, left=[ db.products.on(db.products.id == db.contractedproducts.product) ]) return dict(stores=stores, host=stores[0].shop.host, ip=stores[0].shop.ip, contractedproducts=contractedproducts)
def enabledomain(): from shops import Shop, DomainShop, PricePlan, ContractedProduct, Product Shop(db), DomainShop(db), PricePlan(db), ContractedProduct(db), Product(db) shop = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select().first() if shop: if shop.priceplan.paymode == 'free': #hay que pasar por caja, pero antes comprobar si hay algún pedido en planes distintos a free para esta tienda pendiente de ser aprobado pending = db((db.contractedproducts.shop == shop.id) & (db.contractedproducts.user == auth.user_id) & (db.contractedproducts.start == None) & ((db.priceplans.paymode != None) & (db.priceplans.paymode != 'free'))).select( db.contractedproducts.id, join=[ db.products.on(db.products.id == db. contractedproducts.product), db.priceplans.on( db.priceplans.id == db.products.plan) ]).first() logger.debug( db((db.contractedproducts.shop == shop.id) & (db.contractedproducts.user == auth.user_id) & (db.contractedproducts.start == None) & ((db.priceplans.paymode != None) & (db.priceplans.paymode != 'free')))._select( db.contractedproducts.id, join=[ db.products.on(db.products.id == db.contractedproducts.product), db.priceplans.on( db.priceplans.id == db.products.plan) ])) if pending == None: if request.vars.host: redirect( URL(request.application, 'plans', 'index', vars=dict(host=request.vars.host))) else: session.flash = "Este pedido para cambiar de plan, estaba pendiente de confirmación pago" redirect(URL('payment', 'index')) else: #este dominio está en shop con un priceplan de pago, así que se puede llamar al api de internalgexcommerce para configurar el apache logger.debug("de pagoooo") else: session.flash = "No podemos encontrar la tienda %s" % request.vars.host redirect(URL('index'))
def index(): from shops import Shop, DomainShop, PricePlan Shop(db), DomainShop(db), PricePlan(db) shop = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select().first() if shop: return dict(host=shop.host) else: session.flash = "No podemos encontrar la tienda %s" % request.vars.host redirect(URL('index'))
def deletedomain(): from shops import Shop, DomainShop, PricePlan Shop(db), DomainShop(db), PricePlan(db) shophost = request.vars.host shop = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select().first() redirection = False ip = shop.ip if shop: try: db((db.domainshops.shop == shop.id) & (db.domainshops.host == request.vars.hostname) & (db.domainshops.domain == request.vars.domain)).delete() session.flash = "Dominio borrado con éxito" return "ok" except Exception as ex: return ex else: session.flash = "No podemos encontrar la tienda %s" % request.vars.host redirect(URL('index'))
def modifydomain(): from shops import Shop, DomainShop, PricePlan Shop(db), DomainShop(db), PricePlan(db) shophost = request.vars.host shop = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select().first() redirection = False ip = shop.ip if shop: try: db((db.domainshops.shop == shop.id) & (db.domainshops.host == request.vars.o_hostname) & (db.domainshops.domain == request.vars.o_domain)).update( domain=request.vars.domain, host=request.vars.hostname, active='modifying') db.commit() session.flash = "Modificación realizada con éxito" return "ok" except Exception as ex: return ex else: session.flash = "No podemos encontrar la tienda %s" % request.vars.host redirect(URL('index'))
import os import socket import datetime import copy import gluon.contenttype import gluon.fileutils from blog import Blog, Draft, Images from shops import Shop, DomainShop, PricePlan, Product, ContractedProduct, ProfilePlan, PricePlan, CustomerAgreement, Agreement from invoices import Invoice, Order, Orderlist, Fiscal, CreditAccount, AccountingEntry, Budget, Budgetlist from regnews import Regnews from province import Province from cities import Cities Images(db), Blog(db, ckeditor), Draft( db, ckeditor), Regnews(db), Province(db), Cities(db) Shop(db), PricePlan(db), DomainShop(db), Product(db) ProfilePlan(db), PricePlan(db), CustomerAgreement(db), Agreement(db) Invoice(db), Order(db), Orderlist(db), Budget(db), Budgetlist(db), Fiscal( db), ContractedProduct(db), CreditAccount(db), AccountingEntry(db) try: import pygraphviz as pgv except ImportError: pgv = None # ## critical --- make a copy of the environment global_env = copy.copy(globals()) global_env['datetime'] = datetime http_host = request.env.http_host.split(':')[0]
def payment(): from invoices import Order, Orderlist from shops import Product, Shop, DomainShop, ContractedProduct from adminsettings import Adminsettings from auxiliartools import AuxiliarTools Adminsettings(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() Shop(db), Order(db), Orderlist(db), Product(db), DomainShop( db), ContractedProduct(db) external = AuxiliarTools(db) host = request.vars.host plan = request.vars.plan cert = request.vars.cert if host and plan and cert: #hay que comprobar que viene por request un plan asignado a una tienda con el dato del cert try: db((db.orders.status == 'Creando') & (db.orders.user == auth.user_id)).delete( ) #sólo puede haber un pedido en estado de creación. plan = db(db.priceplans.id == request.vars.plan).select().first() shop = db((db.shop.host == request.vars.host) & (db.shop.user == auth.user_id)).select().first() if shop and plan: #comprobar que existe y es suyo (siempre por seguridad) profileplans = db(db.profileplans.priceplan == plan).select() total = float(0) for profileplan in profileplans: if profileplan.active: product = db(db.products.id == profileplan.product).select().first() if product.name.find("SSL") != -1 and cert == "false": continue total = total + float(product.price) orderid = db.orders.insert( user=auth.user_id, total=total, totaltax="%.2f" % float( ((total * float(settings.tax)) / 100)), status="Creando", payment_code=db.paymentcodes.insert( code=external.generatecode()), payment_method=None) for profileplan in profileplans: if profileplan.active: product = db(db.products.id == profileplan.product).select().first() if product.name.find("SSL") != -1 and cert == "false": continue orderlistid = db.orderlist.insert( product=product.id, g_order=orderid, quantity=1, price=product.price, price_wdto=product.price, tax=settings.tax) #NO SE PUEDE HACER EL INSERT DIRECTAMENTE. HAY QUE VER SI EL SHOP YA TIENE CONTRATADO EL PRODUCTO. SI NO TIENE se hace un INSERT, si no, no hace nada. #En realidad esta comprobación no hace falta porque no se va a dar este caso, pero sí en contracts.postcontracts por ser una generación de contratos manual . #Sólo se va a poder contratar una unidad y la recursividad y duración de la periodicidad harán el resto. contracted = db( (db.contractedproducts.shop == shop.id) & (db.contractedproducts.user == auth.user_id) & (db.contractedproducts.product == product.id) ).select().first() if not contracted: db.contractedproducts.insert( user=auth.user_id, product=product.id, period=product.min_period, autorenove=product.suscription, start=None, renove=None, #fecha de la renovación. expiration=None, shop=shop.id, orderlist=orderlistid, paymentmethod=None) db.commit() return "OK" except Exception as ex: session.flash = "Ocurrió un error al crear el pedido %s" % ex redirect(request.env.http_referer) else: session.flash = "Disculpen la molestias. No podemos encontrar la información requerida" redirect(request.application, 'account', 'index')
def setdomain(): from shops import Shop, DomainShop, PricePlan from auxiliartools import IS_NOT_IN_DB_OR_OWNERSHOP Shop(db), DomainShop(db), PricePlan(db) shophost = request.vars.shop shop = db((db.shop.host == request.vars.shop) & (db.shop.user == auth.user_id)).select( db.shop.ALL, db.priceplans.ALL, join=[ db.priceplans.on(db.priceplans.id == db.shop.priceplan) ]).first() redirection = False ip = shop.shop.ip if shop: domain = Field( 'domain', 'string', length=45, notnull=True, requires=[ IS_NOT_EMPTY(error_message='¿olvidaste decirnos el dominio?'), IS_NOT_IN_DB_OR_OWNERSHOP( db, shop.shop.id, error_message= "Este dominio ya está siendo usado. Contacta con nosotros si crees que es un error por nuestra parte." ), IS_URL(error_message="ejemplo de formato: gextiendas.es") ]) host = Field('host', 'string', length=45, notnull=False, requires=[IS_MATCH('^\w+$', 'Sólo letras y números')]) form = SQLFORM.factory(domain, host, submit_button='establecer dominio') if form.validate(): try: if ((db((db.domainshops.host == form.vars.host) & (db.domainshops.domain == form.vars.domain.replace( "http://", ""))).select().first() == None) and (form.vars.domain.replace("http://", "") not in [ "gextiendas.es", "gextiendas.com", "gestionexperta.com", "gestionexperta.es" ])): if shop.priceplans.paymode == 'ifselling' or shop.priceplans.paymode == 'flatrate': db.domainshops.insert(shop=shop.shop.id, host=form.vars.host, domain=form.vars.domain.replace( "http://", ""), active="enabling") elif shop.priceplans.paymode == 'free': db.domainshops.insert(shop=shop.shop.id, host=form.vars.host, domain=form.vars.domain.replace( "http://", ""), active="disabled") db.commit() else: session.flash = "%s.%s ya está siendo utilizado" % ( form.vars.host, form.vars.domain.replace( "http://", "")) redirection = True except Exception as ex: logger.debug("Error en account/setdomain %s" % ex) db.rollback() response.flash = "Ocurrió un error al establecer el nombre de dominio." elif form.errors: response.flash = "Ocurrió algún error" if redirection: redirect(URL('index')) return dict(form=form, ip=ip) else: redirect(URL('index'))
def newshop(): # if settings.prelaunch==True and not (auth.has_membership('administradores') or auth.has_membership('superadministradores')): # redirect(URL(request.application, 'communications','prelaunch')) from shops import Shop, DomainShop from gluon.contrib.pysimplesoap.client import SoapClient import time Shop(db), DomainShop(db) lenshops = db((db.shop.id > 0) & (db.shop.user == auth.user_id)).count() count = db.domainshops.id.count() countsdomainshops = int( db((db.shop.id > 0) & (db.shop.user == auth.user_id) & (db.domainshops.shop == db.shop.id)).select( count, left=[db.domainshops.on(db.domainshops.shop == db.shop.id) ]).first()['COUNT(domainshops.id)']) shopid = None if lenshops <= 10 + countsdomainshops: form = None from queuemail import Queuemail Queuemail(db) firstname = Field( 'first_name', 'string', length=128, notnull=True, requires=IS_NOT_EMPTY( error_message= 'Para dirigirnos a usted y para los clientes en su tienda')) lastname = Field( 'last_name', 'string', length=128, notnull=True, requires=IS_NOT_EMPTY( error_message= 'Para dirigirnos a usted y para los clientes en su tienda')) shopname = Field( 'name', 'string', length=80, notnull=True, unique=True, requires=[ IS_NOT_EMPTY( error_message='No olvide decirnos el nombre de su tienda'), IS_NOT_IN_DB(db, 'shop.name', error_message="Este nombre ya está siendo usado") ]) hostname = Field( 'host', 'string', length=45, notnull=True, unique=True, requires=[ IS_MATCH( '^\w+$', 'Sólo letras y números, ni espacios ni caracteres especiales' ), IS_NOT_EMPTY( error_message= 'Más adelante podrás poner tu propio dominio, pero ahora es importante este dato' ), IS_NOT_IN_DB(db, 'shop.host', error_message="Este nombre ya está siendo usado") ]) form = SQLFORM.factory(firstname, lastname, shopname, hostname, submit_button=T('Create new store')) if form.validate(): try: #almacena los datos dbdata = "%s" % str(time.time()).replace('.', '') shopid = db.shop.insert( user=auth.user_id, host=form.vars.host, db_name="gex%s" % dbdata, db_user="******" % dbdata, name=form.vars.name, email=auth.user.email, first_name=form.vars.first_name, last_name=form.vars.last_name, country='es', language='es', ip=__get_ip_address('wlan0'), ) client = SoapClient( wsdl= "http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None" ) if client.addShopSite(auth.user_id, shopid)['result'] == "0": db(db.shop.id == shopid).update(status="enabled") db.commit() else: db.rollback() response.flash = "Ocurrió un error al generar la tienda." session.shopname = form.vars.host except Exception as ex: logger.debug(ex) db.rollback() response.flash = "Ocurrió un error al generar la tienda." session.flash = "En unos minutos recibirá un correo con los datos de su nueva instancia de tienda" redirect(URL('account', 'index')) # if request.vars.priceplan: # plan=db.priceplans(request.vars.priceplan) # if plan.paymode=='free': # redirect(URL('index')) # else: # redirect(URL('setdomain', vars=dict(plan=request.vars.priceplan, shop=shopid))) # else: # redirect(URL('plans')) elif form.errors: response.flash = 'Revise los campos erróneos' else: session.flash = "Ńo puede crear más tiendas. Contrate alguno de los planes de pago" return dict(form=form, domainshops=countsdomainshops)
def __init__(self, db, shopid, error_message="Este dominio ya está siendo usado en otra tienda"): self.error_message=error_message self.shopid=shopid self.db=db Shop(self.db), DomainShop(self.db)