# -*- coding: ISO-8859-1 -*-
# generated by wxGlade 0.4cvs on Tue Jan 17 00:02:27 2006

import wx


import gmAU_AdminLoginV01
from Gnumed.pycommon import gmPG

import pyPgSQL.PgSQL as pgsql


class FailedPrecondition(Exception):
	pass

class LoginCancelled(Exception):
	pass

class NoAuthorityToCreateUsers(Exception):
	pass


# begin wxGlade: dependencies
# end wxGlade


class gmAU_DBUserSetup(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: gmAU_DBUserSetup.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.list_ctrl_2 = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.label_17 = wx.StaticText(self, -1, "user")
        self.text_ctrl_6 = wx.TextCtrl(self, -1, "")
        self.label_18 = wx.StaticText(self, -1, "password")
        self.text_ctrl_9 = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD)
        self.label_19 = wx.StaticText(self, -1, "confirm pass")
        self.text_ctrl_10 = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD)
        self.label_20 = wx.StaticText(self, -1, "groups")
        self.checkbox_9 = wx.CheckBox(self, -1, "gm_doctors")
        self.checkbox_10 = wx.CheckBox(self, -1, "gm-staff_medical")
        self.checkbox_12 = wx.CheckBox(self, -1, "gm-staff_office")
        self.checkbox_11 = wx.CheckBox(self, -1, "gm_public")
        self.button_16 = wx.Button(self, -1, "update")
        self.button_17 = wx.Button(self, -1, "new")
        self.button_18 = wx.Button(self, -1, "remove")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.update_pg_user, self.button_16)
        self.Bind(wx.EVT_BUTTON, self.new_pg, self.button_17)
        self.Bind(wx.EVT_BUTTON, self.remove_pg_user, self.button_18)
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: gmAU_DBUserSetup.__set_properties
        pass
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: gmAU_DBUserSetup.__do_layout
        sizer_31 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_32 = wx.BoxSizer(wx.VERTICAL)
        sizer_34 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_4 = wx.FlexGridSizer(4, 2, 0, 0)
        sizer_33 = wx.BoxSizer(wx.VERTICAL)
        sizer_31.Add(self.list_ctrl_2, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(self.label_17, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.text_ctrl_6, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_18, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.text_ctrl_9, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_19, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.text_ctrl_10, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_20, 0, wx.ADJUST_MINSIZE, 0)
        sizer_33.Add(self.checkbox_9, 0, wx.ADJUST_MINSIZE, 0)
        sizer_33.Add(self.checkbox_10, 0, wx.ADJUST_MINSIZE, 0)
        sizer_33.Add(self.checkbox_12, 0, wx.ADJUST_MINSIZE, 0)
        sizer_33.Add(self.checkbox_11, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(sizer_33, 1, wx.EXPAND, 0)
        sizer_32.Add(grid_sizer_4, 1, wx.EXPAND, 0)
        sizer_34.Add(self.button_16, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
        sizer_34.Add(self.button_17, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
        sizer_34.Add(self.button_18, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
        sizer_32.Add(sizer_34, 1, wx.EXPAND, 0)
        sizer_32.Add((20, 20), 0, wx.ADJUST_MINSIZE, 0)
        sizer_31.Add(sizer_32, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_31)
        sizer_31.Fit(self)
        sizer_31.SetSizeHints(self)
        # end wxGlade


# end of class gmAU_DBUserSetup

    def update_pg_user(self, event): # wxGlade: cAU_DBUserSetup.<event_handler>
        print "Event handler `update_pg_user' not implemented!"
	try:
		self._precondition_update()
		if self.GetParent().IsModal():
			GetParent().EndModal(wx.ID_OK)		
	except FailedPrecondition, e:
		wx.MessageDialog(self, str(e) ).ShowModal()	
	except LoginCancelled:
		wx.MessageDialog(self, "Login Was Cancelled").ShowModal()

	except pgsql.OperationalError, msg:
		wx.MessageDialog(self, str(msg) ).ShowModal()
	except:
		print "IsModel failed ? "
		import traceback as tb
		import sys
		tb.print_tb(sys.exc_info()[2])
		wx.MessageDialog(self, str(sys.exc_info()[0])  + "\n" + str(sys.exc_info()[1]) ).ShowModal()
		
        event.Skip()


    def _precondition_update(self):
	group_widg = [ self.checkbox_9, self.checkbox_10, self.checkbox_11]
	group_checked = [ x.GetValue() for x in group_widg]
	
	if [x for x in group_checked if x] == [] :
		raise FailedPrecondition, "no group selected"
	
	l2 = [ self.text_ctrl_6, self.text_ctrl_9, self.text_ctrl_10]
	l3 = [ x.GetValue() for x in l2]
	if [x for x in l3 if x.strip() <> ''] == []:
		raise FailedPrecondition, "No values in fields"

	[user, passwd, confirm] = [x.strip() for x in l3]
	
	if passwd <> confirm :
		raise FailedPrecondition, "Passwords don't match"
	
	if passwd == "":
		raise FailedPrecondition, "Password cannot be blank"

	if user == "":
		raise FailedPrecondition, "User cannot be blank"

	import pdb
	
	pdb.set_trace()
	
	enable_dbo = """echo "alter user \"gm-dbo\" createuser" > dat;su -c "su -c \"psql -f dat template1\" postgres" """


	[[canCreateUsers]] = gmPG.run_ro_query("historica", "select usesuper from pg_user where usename = 'gm-dbo'")
	if not canCreateUsers :
		while wx.MessageDialog(self, "The database owner cannot create users: you must do :-\n  alter user \"gm-dbo\" createuser \nAs postgres user.\n Press OK if this has been done", style = wx.OK | wx.CANCEL ).ShowModal() == wx.ID_OK :
			[[canCreateUsers]] = gmPG.run_ro_query("historica", "select usesuper from pg_user where usename = 'gm-dbo'")
			if canCreateUsers:
				break
		if not canCreateUsers:		
			raise NoAuthorityToCreateUsers
		

	
	result = gmPG.run_ro_query("historica", """select usename from pg_user where usename = '%s'  """ % user)
	
	perms = []
	for n, in_group in zip( ['gm-staff', 'gm-doctors', 'gm-public'], group_checked ):
		if in_group:
			perms.append(""" alter group \"%s\" add user \"%s\" """ % (n, user) )
		else:
			perms.append(""" alter group "%s" drop user "%s" """ %( n, user) )
	if result and len(result) == 1:
		#alter an existing user
		self._exec_su( [""" alter user "%s" password '%s' """ % (user, passwd) ] + perms , self.su_login)
	
	else:
		#create a new user
		self._exec_su( [""" create user "%s" password '%s' """ % ( user, passwd) ] + perms , self.su_login)
		
	
    def _exec_su( self, stmt_list, pg_con_getter):
   	con = pg_con_getter()
	
	cursor = con.cursor()
	for stmt in stmt_list:
		cursor.execute(stmt)

	con.commit()
	con.close()	
	
	
    def su_login( self):
	dlg = gmAU_AdminLoginV01.cAU_AdminLoginDialogV01(self, -1)
	if dlg.ShowModal() == wx.ID_OK:
		con = dlg.get_connection()
		dlg.Destroy()
		return con		
	else:
		dlg.Destroy()
		raise CancelledLogin

	

    def new_pg(self, event): # wxGlade: cAU_DBUserSetup.<event_handler>
        print "Event handler `new_pg' not implemented!"
        event.Skip()

    def remove_pg_user(self, event): # wxGlade: cAU_DBUserSetup.<event_handler>
        print "Event handler `remove_pg_user' not implemented!"
        event.Skip()


