from django.shortcuts import render
from django.http import HttpResponseRedirect,HttpResponse,HttpRequest
from django.urls import reverse
from datetime import datetime
import json
from .models import *
from .forms import *
from supporto import managepassword
from sicurezza.views import *
from logger.views import *
from comunicazioni.views import *
from datetime import date,datetime
from time import time,strftime
from configurazione.views import *
import re 

from mqtt import views as m
from mqtt.views import mqtt

# Create your views here.
def SqlDatabaseList(request):

  session = getSessionParms(request)
  userauth = session['_userauth_']
  sqldatabase2edit = session['_sqldatabase2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Sql:SqlDatabaseList"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['sqldatabaselist'] = SqlDatabase.objects.filter(dominio=domain2edit).order_by('nome')
  value['dominio'] = dominio
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
  value['CANWRITE']=True #per il momento, questo flag serve a capire se e' un record nuovo

  # step: procurare la riga ftp master
  path = None
  print('dominio',dominio.id)

  listaftp = dominio.ftpuser_set.all()
  path = None
  for f in listaftp:
    if f.ftpgroup.master:
      path = ''.join((f.ftpgroup.home,f.dominio.nome))
      print('home ftp',path)

  print('Test Database HTTP Server',dominio.id,dominio.nome)

  if path:
    value['has_http_server'] = True
  else:
    value['has_http_server']= False
    print('non risulta assegnato il server http')

  #vecchia versione mqtt
  c = m.start()

  # nuova versione mqtt
  mq = mqtt()
  mq.build('topic','Messaggio')
  mq.build('richiesta','Database')
  mq.build('stampa',False)
  tmp = dict()
  tmp['login'] = "".join((utenteautorizzato.nome,"@",utenteautorizzato.domain.nome))
  tmp['remote'] = request.META.get('REMOTE_ADDRESS')
  tmp['forwarder' ] = request.META.get('HTTP_X_FORWARDER_FOR','')
  tmp['host'] = request.META.get('REMOTE_ADDR','')
  mq.build('data',tmp)
  mq.pubblica()
  tmp=None
  mq=None

  if request.method == 'POST':
    print('request.method',request.method)
    print(request.POST)

    if 'NuovoSqlDatabase' in request.POST:
      print('Richiesto nuovo database')
      request.session['_sqldatabase2edit_'] = 0
      return HttpResponseRedirect(reverse('Sql:SqlDatabaseEdit',args={}))

    if 'AggiornaDbConf' in request.POST and path != None:
      print('Richiesta Aggiornamento db.conf')

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','writedb.conf')
      mq.build('stampa',False)
      tmp = dict()

      data = list()
      for d in value['sqldatabaselist']:
        tmp=dict()
        if d.enabled and not d.tobedeleted:
          print('database',d.nome)
          tmp['do']=d.dominio.nome
          tmp['id']=d.dominio.id
          tmp['db']=d.nome
          tmp['us']=d.username
          tmp['ho']=d.server.server
          tmp['pw']=d.password
          tmp['pa']=path
          data.append(tmp)

      print('data',data)
      mq.build('data',data)
      mq.pubblica()
      tmp=None
      mq=None
      
    if 'LeggiDbConf' in request.POST and path != None:
      print('richiesta lettura db.conf')

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','readdb.conf')
      mq.build('stampa',False)

      data = list()
      q={}
      q['op']='readdbconf'
      q['do']=dominio.nome
      q['id']=dominio.id
      q['pa']=path
      print(q)
      data.append(q)
      print(data)

      mq.build('data',data)
      mq.pubblica()
      tmp=None
      mq=None

    # backup di tutti i db nel dominio
    sqlpath = getConfigurazione('sql:path')
    backuppath = getConfigurazione('sql:backuppath')

    if 'BackupDbDom' in request.POST:
      print('Richiesta backup Database Dominio')

      q = dict()

      database2backup = list()

      for i in value['sqldatabaselist']:
        if i.enabled:
          infodb = dict()
          infodb['db']=i.nome
          infodb['us']=i.username
          infodb['ho']=i.server.server
          infodb['pw']=i.password
          infodb['do']=i.dominio.nome
          infodb['id']=i.dominio.id
          infodb['dbid'] = i.id

          f = i.dominio.ftpuser_set.all().filter(ftpgroup__master=True)

          for singleftp in f: 
            print(dir(singleftp))
            print(singleftp.homedir,singleftp.ftpgroup.l3,singleftp.ftpgroup.directory  % { 'ftp':singleftp.utente,'site':i.dominio.nome })
            #infodb['st'] = x.homedir + "/" + sqlpath
            tmp = singleftp.ftpgroup.directory % { 'ftp':singleftp.utente,'site':i.dominio.nome }
            infodb['st'] =tmp
            infodb['pa'] = "/" + backuppath
            infodb['pr'] = 0 #periodo singolo
            print('infodb',infodb)
            database2backup.append(infodb)
        
      print(q)
      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','backupdatabasedominio')
      mq.build('stampa',True)
      mq.build('data',database2backup)
      mq.pubblica()
      tmp=None
      mq=None

    if 'edit' in request.POST:
      print('edit',request.POST.get('edit'))
      request.session['_sqldatabase2edit_'] = request.POST.get('edit')
      return HttpResponseRedirect(reverse('Sql:SqlDatabaseEdit',args={}))

    if 'enable' in request.POST:
      print('enabled in request.POST',request.POST.get('enable'))
      sqlsingledatabase = SqlDatabase.objects.get(pk=request.POST.get('enable'))
      sqlsingledatabase.enabled = True
      #qlsingledatabase.tobedeleted = False
      sqlsingledatabase.save()

      q={}
      q['op']='enable'
      q['db']=sqlsingledatabase.nome
      q['us']=sqlsingledatabase.username
      q['pw']=sqlsingledatabase.password
      q['ho']=sqlsingledatabase.server.server

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','enable_database')
      mq.build('stampa',True)
      mq.build('data',q)
      mq.pubblica()
      tmp=None
      mq=None

    if 'disable' in request.POST:
      print('disabled in request.POST',request.POST.get('disable'))
      sqlsingledatabase = SqlDatabase.objects.get(pk=request.POST.get('disable'))
      if not sqlsingledatabase.locked:
        sqlsingledatabase.enabled = False
        sqlsingledatabase.tobedeleted = False
        sqlsingledatabase.save()
        q={}
        q['op']='disable'
        q['db']=sqlsingledatabase.nome
        q['us']=sqlsingledatabase.username
        q['ho']=sqlsingledatabase.server.server

        #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
        #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))
        
        mq = mqtt()
        mq.build('topic','richiesta/database')
        mq.build('richiesta','disable_database')
        mq.build('stampa',True)
        mq.build('data',q)
        mq.pubblica()
        tmp=None
        mq=None

    if 'delete' in request.POST:
      print('delete in request.POST',request.POST.get('delete'))
      sqlsingledatabase = SqlDatabase.objects.get(pk=request.POST.get('delete'))
      print("richiesta cancellazione db:",sqlsingledatabase.id)
      if not sqlsingledatabase.locked:
        print("coferma richiesta")
        sqlsingledatabase.enabled = False
        sqlsingledatabase.tobedeleted = True
        sqlsingledatabase.save()
        
        q={}
        q['op']='disable'
        q['db']=sqlsingledatabase.nome
        q['us']=sqlsingledatabase.username
        q['ho']=sqlsingledatabase.server.server

        #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
        #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

        mq = mqtt()
        mq.build('topic','richiesta/database')
        mq.build('richiesta','disable_database')
        mq.build('stampa',True)
        mq.build('data',q)
        mq.pubblica()
        tmp=None
        mq=None

    if 'backup' in request.POST:
      print('effettuo backup request.POST',request.POST.get('backup'))
      sqlsingledatabase = SqlDatabase.objects.get(pk=request.POST.get('backup'))
      qq={}
      qq['op']='backup'
      qq['db']=sqlsingledatabase.nome
      qq['us']=sqlsingledatabase.username
      qq['pw']=sqlsingledatabase.password
      qq['ho']=sqlsingledatabase.server.server
      qq['do']=sqlsingledatabase.dominio.nome
      qq['id']=sqlsingledatabase.dominio.id
      qq['dbid']=sqlsingledatabase.id
      qq['pa']=path
      qq['dd']=sqlsingledatabase.id

      f = sqlsingledatabase.dominio.ftpuser_set.all().filter(ftpgroup__master=True)
      for singleftp in f: 
        print(dir(singleftp))
        print(singleftp.homedir,singleftp.ftpgroup.l3,singleftp.ftpgroup.directory  % { 'ftp':singleftp.utente,'site':sqlsingledatabase.dominio.nome })
        #infodb['st'] = x.homedir + "/" + sqlpath
        tmp = singleftp.ftpgroup.directory % { 'ftp':singleftp.utente,'site':sqlsingledatabase.dominio.nome }
        qq['st'] =tmp
        qq['pa'] = "/" + backuppath
        qq['pr'] = 0 #periodo

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','backupdatabasesingolo')
      mq.build('stampa',True)
      mq.build('data',[qq])
      mq.pubblica()
      tmp=None
      mq=None


    if 'phpmyadmin' in request.POST:
      sqlsingledatabase = SqlDatabase.objects.get(pk=request.POST.get('phpmyadmin'))
      #sqlsingledatabase.allowexternal=True
      #sqlsingledatabase.save()
      print('Eseguo PhpMyAdmin',request.POST.get('phpmyadmin'))
      html = HttpResponse('Eseguo php...',status=302)
      html['location']='https://altemica.net/phpmyadmin/index.php'
      html['Target'] = '_blank'

      html.set_cookie('PMA_username',sqlsingledatabase.username,max_age=None)
      html.set_cookie('PMA_password',sqlsingledatabase.password,max_age=None)
      html.set_cookie('PMA_host',sqlsingledatabase.server.server,max_age=None)
      html.set_cookie('PMA_database',sqlsingledatabase.nome,max_age=None)
      return html


  return render(request,"sql.database.list.html",value)

def SqlServerList(request):

  session = getSessionParms(request)
  userauth = session['_userauth_']
  sqlserver2edit = session['_sqlserver2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Sql:SqlServerList"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['dominio'] = dominio
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
  value['CANWRITE']=True #per il momento, questo flag serve a capire se e' un record nuovo

  if request.method == 'POST':
    print('request.method',request.method)

    if 'NuovoSqlServer' in request.POST:
      request.session['_sqlserver2edit_'] = 0
      return HttpResponseRedirect(reverse('Sql:SqlServerEdit',args={}))

    if 'enabled' in request.POST:
      print('enabled in request.POST',request.POST.get('enabled'))
      sqlsingleserver = SqlServer.objects.get(pk=request.POST.get('enabled'))
      sqlsingleserver.enabled = True
      sqlsingleserver.save()

    if 'disabled' in request.POST:
      print('disabled in request.POST',request.POST.get('disabled'))
      sqlsingleserver = SqlServer.objects.get(pk=request.POST.get('disabled'))
      sqlsingleserver.enabled = False
      sqlsingleserver.save()

    if 'edit' in request.POST:
      print('edit',request.POST.get('edit'))
      request.session['_sqlserver2edit_'] = request.POST.get('edit')
      return HttpResponseRedirect(reverse('Sql:SqlServerEdit',args={}))

  value['sqlserverlist'] = SqlServer.objects.all().order_by('nome')

  return render(request,"sql.server.list.html",value)

def SqlDatabaseEdit(request):
  session = getSessionParms(request)
  if not '_userauth_' in session:
      return HttpResponseRedirect(reverse('Login:login',args={}))

  userauth = session['_userauth_']
  sqldatabase2edit = session['_sqldatabase2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Sql:SqlDatabaseEdit"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)

  c = m.start()
  m.publish(c,"Messaggio/Sql","Accesso al DB di {}".format(utenteautorizzato.nome))

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
 
  sqldatabase = SqlDatabase()
  value['nuovorecord']=False
  try:
    sqldatabase = SqlDatabase.objects.get(pk=sqldatabase2edit)
  except SqlDatabase.DoesNotExist as dne:
    print("errore nella ricerca del server",sqldatabase2edit)
    value['nuovorecord']=True
    # il database e' vuoto, quindi possiamo inserire username e password predefiniti
    # 1: otteniamo un nome valido per un db, normalizzazione dominio
    # 2: otteniamo un nome normalizzato valido per un db

    dominio_parte_prima_delpunto =  dominio.nome.split('.')[0]
    dominio_parte_dopo_delpunto = dominio.nome.split('.')[1]
    dominio_senza_punto = dominio_parte_prima_delpunto + dominio_parte_dopo_delpunto

    dominio_normalizzato = dominio_senza_punto.translate(''.maketrans('-','_'))
    utente_normalizzato  = dominio_parte_prima_delpunto.translate(''.maketrans('-','_'))

    now = datetime.now().strftime('%f')[:3]

    numero_db_presenti = len(SqlDatabase.objects.filter(dominio=dominio.id))
    sqldatabase.nome =     '{}_db{}'.format(dominio_normalizzato,numero_db_presenti+1)
    sqldatabase.username = '{}U{}'.format(utente_normalizzato,now)
    sqldatabase.password = getPassword()
    sqldatabase.dominio = dominio
    sqldatabase.enabled = True
    sqldatabase.tobedeleted = False
    sqldatabase.locked = False
    sqldatabase.password_change_enabled=True
    sqldatabase.inbackup=False
    sqldatabase.datebackup=None

    #sqldatabase.server = getConfigurazione('sql server default')

    print(dominio_parte_prima_delpunto,dominio_normalizzato,utente_normalizzato,now,numero_db_presenti)
    print(sqldatabase.nome,sqldatabase.username)

  print('request.POST',request.POST)
  if request.method == 'POST':
    print('request.method',request.method)

    if 'Ritorna' in request.POST:
      request.session['_sqldatabase2edit_'] = sqldatabase2edit
      return HttpResponseRedirect(reverse('Sql:SqlDatabaseList',args={}))

    
    # step: procuratori la riga ftp master
    listaftp = sqldatabase.dominio.ftpuser_set.all()
    path = None
    for f in listaftp:
      if f.ftpgroup.master:
        path = f.homedir
        print(f.homedir)

    # step: invio comando mqtt
    if 'AggiornaDbConf' in request.POST and path != None:
      print("Aggiorno il db")
      q={}
      q['op']='writedbconf'
      q['db']=sqldatabase.nome
      q['us']=sqldatabase.username
      q['ho']=sqldatabase.server.server
      q['pw']=sqldatabase.password
      q['pa']=f.homedir
      q['do']=sqldatabase.dominio.nome
      q['id']=sqldatabase.dominio.id

      #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
      #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

      mq = mqtt()
      mq.build('topic','richiesta/database')
      mq.build('richiesta','writedb.conf')
      mq.build('stampa',True)
      mq.build('data',q)
      mq.pubblica()
      tmp=None
      mq=None


    formsqldatabase=formSqlDatabase(request.POST)
    if formsqldatabase.is_valid():
      print('formsqldatabase.is_valid',formsqldatabase.is_valid())

      oldsqldatabase = sqldatabase #faccio una copia del record per confrontarmi.

      if not sqldatabase.server_id:
        sqldatabase.server_id = formsqldatabase.cleaned_data.get('server')

      # sqldatabase.dominio = xxxx 
      sqldatabase.locked = formsqldatabase.cleaned_data.get('locked')
      print('sqldatabase.locked',sqldatabase.locked)

      if value['nuovorecord']:
        sqldatabase.nome = formsqldatabase.cleaned_data.get('nome')
 
      if not sqldatabase.locked:
        sqldatabase.username = formsqldatabase.cleaned_data.get('username')
        oldpassword = sqldatabase.password
        sqldatabase.password = formsqldatabase.cleaned_data.get('password')
        if oldpassword != sqldatabase.password:
          sqldatabase.password_last_update = datetime.now()
        
      sqldatabase.enabled = formsqldatabase.cleaned_data.get('enabled')
      sqldatabase.tobedeleted = formsqldatabase.cleaned_data.get('tobedeleted')

      if sqldatabase.tobedeleted:
        sqldatabase.enabled = False

      sqldatabase.nota = formsqldatabase.cleaned_data.get('nota')
      sqldatabase.mail = formsqldatabase.cleaned_data.get('mail')
      print('sqldatabase.mail',sqldatabase.mail)
      sqldatabase.aggiornamento = datetime.now()
      sqldatabase.server_id = formsqldatabase.cleaned_data.get('server')
      noneseguire = formsqldatabase.cleaned_data.get('noneseguire')
      print('stato di :noneseguire:',noneseguire)
      sqldatabase.save()
      print('database salvato')

      # creato o cambiato nome utente
      if sqldatabase.username != oldsqldatabase.username:
        pass
      else:
        pass
      # creata o cambiata password
      if sqldatabase.password != oldsqldatabase.password:
        pass
      else:
        pass

      if not noneseguire:
        # creato nuovo db
        if value['nuovorecord']:
          q={}
          q['op']='create'
          q['db']=sqldatabase.nome
          q['us']=sqldatabase.username
          q['pw']=sqldatabase.password
          q['ho']=sqldatabase.server.server

          #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
          #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

          mq = mqtt()
          mq.build('topic','richiesta/database')
          mq.build('richiesta','create_database')
          mq.build('stampa',True)
          mq.build('data',q)
          mq.pubblica()
          tmp=None
          mq=None

        # abilitato accesso al db
        if sqldatabase.enabled:
          q={}
          q['op']='enable'
          q['db']=sqldatabase.nome
          q['us']=sqldatabase.username
          q['ho']=sqldatabase.server.server
          q['pw']=sqldatabase.password

          #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
          #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

          mq = mqtt()
          mq.build('topic','richiesta/database')
          mq.build('richiesta','enable_database')
          mq.build('stampa',True)
          mq.build('data',q)
          mq.pubblica()
          tmp=None
          mq=None
        else:
          q={}
          q['op']='disable'
          q['db']=sqldatabase.nome
          q['us']=sqldatabase.username
          q['ho']=sqldatabase.server.server

          #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
          #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

          mq = mqtt()
          mq.build('topic','richiesta/database')
          mq.build('richiesta','disable_database')
          mq.build('stampa',True)
          mq.build('data',q)
          mq.pubblica()
          tmp=None
          mq=None

        # cancella il database
        if sqldatabase.tobedeleted:
          q={}
          q['op']='delete'
          q['db']=sqldatabase.nome
          q['us']=sqldatabase.username
          q['ho']=sqldatabase.server.server

          #m.publish(c,"Richiesta/Sql","{}".format(json.dumps(q)))
          #m.publish(c,"Messaggio/Sql","{}".format(json.dumps(q)))

          mq = mqtt()
          mq.build('topic','richiesta/database')
          mq.build('richiesta','delete_database')
          mq.build('stampa',True)
          mq.build('data',q)
          mq.pubblica()
          tmp=None
          mq=None

      sm = ServizioMail()
      sql_notifica = getConfigurazione('sql:notifica')
      sql_notifica = re.split(',| ',sql_notifica)
      sm.set_listadestinatari(sql_notifica)

      if formsqldatabase.cleaned_data.get('mail_send'):
        mailweb = formsqldatabase.cleaned_data.get('mail')
        mailweb = re.split(',| ',mailweb)
        sm.add_listadestinatari(mailweb)

      # questo dovrebbe essere il profilo per la gestione via mail.
      #sm.add_listadestinatari(getConfigurazione('service'))
  
      #recuperiamo il template
      template = Template.objects.get(pk=getConfigurazione('sql:template'))
      template_soggetto = template.soggetto
      sm.set_soggetto(template_soggetto)
      template_oggetto = template.oggetto
      sm.set_oggetto(template_oggetto)

      template_dati = {}
      template_dati['sqldatabase'] = sqldatabase
      sm.set_data(template_dati)

      sqljs = {}
      sqljs['service'] = 'SQL'
      sqljs['nome'] = sqldatabase.nome
      sqljs['server'] = sqldatabase.server.server
      sqljs['username'] = sqldatabase.username
      sqljs['password'] = sqldatabase.password
      sqljs['enabled'] = sqldatabase.enabled
      sqljs['locked' ] = sqldatabase.locked
      sqljs['tobedeleted'] = sqldatabase.tobedeleted
      sm.set_json(sqljs) 

      sm.send()

      return  HttpResponseRedirect(reverse('Sql:SqlDatabaseList',args={}))
    else:
      print('formsqldatabase.errors',formsqldatabase.errors)

  tmp = {}
  tmp['nome'] = sqldatabase.nome
  tmp['dominio'] = sqldatabase.dominio_id
  tmp['server'] = sqldatabase.server_id
  tmp['username'] = sqldatabase.username
  tmp['password'] = sqldatabase.password
  tmp['enabled'] = sqldatabase.enabled
  tmp['tobedeleted'] = sqldatabase.tobedeleted
  tmp['locked'] = sqldatabase.locked
  print('locked',sqldatabase.locked)
  tmp['quota'] = sqldatabase.quota
  tmp['password_last_update'] = sqldatabase.password_last_update
  tmp['creazione'] = sqldatabase.creazione
  tmp['aggiornamento'] = sqldatabase.aggiornamento
  tmp['nota'] = sqldatabase.nota
  tmp['mail'] = sqldatabase.mail
  print('mail caricata',sqldatabase.mail)
  

  value['formsqldatabase'] = formSqlDatabase(tmp)
  value['sqldatabase'] = sqldatabase
  value['sqlserver'] = SqlServer.objects.all().filter(enabled=1)

  return render(request,"sql.database.edit.html",value)

def SqlServerEdit(request):
 
  session = getSessionParms(request)
  userauth = session['_userauth_']
  sqlserver2edit = session['_sqlserver2edit_']
  domain2edit = session['_domain2edit_']
  request.session['_from_']="Sql:SqlServerEdit"

  try:
    utenteautorizzato = User.objects.get(pk=userauth)
  except User.DoesNotExist as dne:
    return  HttpResponseRedirect(reverse('Login:login',args={}))

  if not domain2edit:
    domain2edit = utenteautorizzato.domain.id

  dominio = Domini.objects.get(pk=domain2edit)

  value={}
  value['utenteautorizzato'] = utenteautorizzato
  value['user'] = None
  value['dominio'] = dominio
  value['navbar'] = True

  print("livello autorizzazione",utenteautorizzato.securitylevel_id)
  securitylevel = getSecurityLevel(utenteautorizzato.securitylevel_id)
  securityrow = getSecurityRow(utenteautorizzato.securitylevel_id)

  value['securityrow'] = securityrow
  value['securityrowLen'] = len(securityrow)
  value['CANWRITE']=True #per il momento, questo flag serve a capire se e' un record nuov

  sqlserver = SqlServer()

  try:
    sqlserver = SqlServer.objects.get(pk=sqlserver2edit)
  except SqlServer.DoesNotExist as dne:
    print("errore nella ricerca del server",sqlserver2edit)

  print('request.POST',request.POST)
  if request.method == 'POST':
    print('request.method',request.method)

    if 'Ritorna' in request.POST:
      request.session['_sqlserver2edit_'] = sqlserver2edit
      return HttpResponseRedirect(reverse('Sql:SqlServerList',args={}))

    formsqlserver = formSqlServer(request.POST)
    if formsqlserver.is_valid():
      print('formsqlserver.is_valid',formsqlserver.is_valid())

      sqlserver.nome = formsqlserver.cleaned_data.get('nome')
      sqlserver.server = formsqlserver.cleaned_data.get('server')
      sqlserver.adminuser = formsqlserver.cleaned_data.get('adminuser')
      sqlserver.adminpass = formsqlserver.cleaned_data.get('adminpass')
      sqlserver.enabled = formsqlserver.cleaned_data.get('enabled')
      sqlserver.nota = formsqlserver.cleaned_data.get('nota')
      sqlserver.save()


  tmp = {}
  tmp['nome'] = sqlserver.nome
  tmp['server'] = sqlserver.server
  tmp['adminuser'] = sqlserver.adminuser
  tmp['adminpass'] = sqlserver.adminpass
  tmp['enabled'] = sqlserver.enabled
  tmp['nota'] = sqlserver.nota

  value['formsqlserver'] = formSqlServer(tmp)

  return render(request,"sql.server.edit.html",value)

def SqlShow(request):
  '''
  questa pagina serve per fornire le informazioni per attivare il nuovo db.
  ho pensato che ogni aggiornamento, creazione e quant'altro memorizzano un timestamp.
  la funzione legge l'ultimo timestamp memorizzato. se e' anteriore a quelli registrati nei singoli record,
  li esegue e aggiorna il timestamp relativo.
  '''

  return render(request,"nomefile",value)

#effettua il backup di tutti i db (oppure di un singolo di, suddiviso per periodo 
def SqlDatabaseBackup(request,database=0,periodo=0):
  # tipo: vedere in urls.py: indica il tipo di backup da effettuare (q,s,m)
  c = m.start()
  m.publish(c,"Messaggio/Sql","Eseguo Backup di tutti i DB")

  '''
  cadenza={}
  cadenza[0]='Giorno'
  cadenza[1]='Settimana'
  cadenza[2]='Mese'
  cadenza[10]='Singolo'
  '''

  d = None
  alldb = False
  if not database:
    d = SqlDatabase.objects.all().filter(enabled=True)
    alldb = True
  else:
    d = SqlDatabase.objects.all().filter(pk=database)

  value = {}
  value['sqldatabaselist']=d
  value['sqldatabasecount'] = len(d)

  print("Database da sottoporre a backup",len(d))

  sqlpath = getConfigurazione('sql:path')
  backuppath = getConfigurazione('sql:backuppath')

  q = dict()
  if not database:
    q['op'] = 'backupDbAll'
  else:
    q['op'] = 'backupDbOne'

  database2backup = list()

  q['pr'] = periodo 

  for i in d:
    print('database: ',i.nome)

    infodb = dict()
    infodb['db']=i.nome
    infodb['us']=i.username
    try: 
      infodb['ho']=i.server.server
    except i.server.DosNotFound:
      print ("manca il db per: ",i.nome)
      m.publish(c,"Messaggio/Sql","Manca Server per db: {}".format(infodb['db']))
      continue
    infodb['pw']=i.password
    infodb['do']=i.dominio.nome
    infodb['id']=i.dominio.id
    infodb['dbid'] = i.id

    f = i.dominio.ftpuser_set.all().filter(ftpgroup__master=True)

    print('lista FTP per dominio',len(f))
    
    for singleftp in f: 
      print(singleftp.homedir,singleftp.ftpgroup.l3,singleftp.ftpgroup.directory % { 'ftp':singleftp.utente,'site':i.dominio.nome })
      #infodb['st'] = x.homedir + "/" + sqlpath
      tmp = singleftp.ftpgroup.directory % { 'ftp':singleftp.utente,'site':i.dominio.nome }
      infodb['st'] =tmp
      if alldb:
        infodb['pa'] = "/" + sqlpath
      else: 
        infodb['pa'] = "/" + backuppath
      infodb['pr'] = periodo
      print('infodb',infodb)
      database2backup.append(infodb)
        
  q['db'] = database2backup

  mq = mqtt()
  mq.build('topic','richiesta/database')
  mq.build('richiesta','backupdatabaseperiodico')
  mq.build('nota','cliid=22')
  mq.build('periodo',periodo)
  mq.build('stampa',True)


  mq.build('data',database2backup)
  mq.pubblica()
  tmp=None
  mq=None

  return render(request,"sql.database.backup.html",value)

