diff --git a/application/classes/Controller/Admin/Module.php b/application/classes/Controller/Admin/Module.php index eac83967..edaa33c6 100644 --- a/application/classes/Controller/Admin/Module.php +++ b/application/classes/Controller/Admin/Module.php @@ -22,25 +22,110 @@ class Controller_Admin_Module extends Controller_Module { protected function _methods($class) { // Get a list of methods this module has $ch = 'Controller_%s'; - $methods = array(); + $methods = $secure_actions = $auth_required = array(); // List of classes where all our methods are, including this one. $classes = URL::$method_directory; array_unshift($classes,''); foreach ($classes as $c) { - $cn = Kohana::classname('Controller_'.$c ? $c.'_'.$class : $class); + $x = URL::dir($c); + $cn = Kohana::classname('Controller_'.($x ? $x.'_'.$class : $class)); if (class_exists($cn)) { $r = new ReflectionClass($cn); - foreach ($r->getMethods() as $method) - if (preg_match('/^Controller_(.*_)?'.$class.'$/i',$method->class) AND ! preg_match('/^_/',$method->name)) - array_push($methods,str_replace('action_',($c ? $c.'_' : $c),$method->name)); + $rdp = $r->getDefaultProperties(); + $secure_actions[$cn] = $rdp['secure_actions']; + $auth_required[$cn] = $rdp['auth_required']; + + foreach ($r->getMethods() as $method) { + if (preg_match('/^action_/',$method->name)) + array_push($methods,str_replace('action_',strtolower(($x ? $x.'_' : $x)),$method->name)); + } } } - return $methods; + return array('methods'=>$methods,'secure_actions'=>$secure_actions,'auth_required'=>$auth_required); + } + + /** + * Edit a Module Configuration + */ + public function action_edit() { + $id = $this->request->param('id'); + $mo = ORM::factory('Module',$id); + + $methods = array(); + + if (! $mo->loaded()) { + SystemMessage::factory() + ->title(_('Invalid Module ID')) + ->type('error') + ->body(sprintf(_('Module with ID %s doesnt appear to exist?'),$id)); + + HTTP::redirect(URL::link('admin','module/list')); + } + + $mm = $this->_methods($mo->name); + $methods['exist'] = array(); + foreach ($mo->module_method->find_all() as $mmo) { + if (in_array($mmo->name,$mm['methods'])) { + $k = array_search($mmo->name,$mm['methods']); + unset($mm['methods'][$k]); + + $mmo->status('INDB'); + } else + $mmo->status('ORPHAN'); + + if (! empty($mm['secure_actions'][$mmo->controller()][$mmo->method()])) + unset($mm['secure_actions'][$mmo->controller()][$mmo->method()]); + + array_push($methods['exist'],$mmo); + } + + $methods['missing'] = array(); + foreach ($mm['methods'] as $k=>$method) { + $mmo = ORM::factory('Module_Method'); + $mmo->module_id = $mo->id; + $mmo->name = $method; + + if (! empty($mm['auth_required'][$mmo->controller()]) AND $mm['auth_required'][$mmo->controller()]) + $mmo->status('MISSING'); + + array_push($methods['missing'],$mmo); + } + + Block::factory() + ->title(sprintf('%s: %s ',_('Defined Module Methods For'),$mo->display('name'))) + ->title_icon('icon-cog') + ->body(Table::factory() + ->data($methods['exist']) + ->columns(array( + 'id'=>'ID', + 'name'=>'Name', + 'notes'=>'Notes', + 'menu_display'=>'Menu', + 'status()'=>'Status', + )) + ->prepend(array( + 'id'=>array('url'=>URL::link('admin','module_method/edit/')), + )) + ); + + Block::factory() + ->title(sprintf('%s: %s ',_('Missing Module Methods For'),$mo->display('name'))) + ->title_icon('icon-exclamation-sign') + ->body(Table::factory() + ->data($methods['missing']) + ->columns(array( + 'name'=>'Name', + 'status()'=>'Status', + )) + ->prepend(array( + 'name'=>array('url'=>URL::link('admin','module_method/add/'.$mo->id.'/')), + )) + ); } /** @@ -49,82 +134,23 @@ class Controller_Admin_Module extends Controller_Module { public function action_list() { $mo = ORM::factory('Module'); - Block::add(array( - 'title'=>_('Defined Modules'), - 'body'=>Table::display( - $mo->find_all(), - 25, - array( - 'id'=>array('label'=>'ID','url'=>URL::link('admin','module/edit/')), - 'name'=>array('label'=>'Name'), - 'status'=>array('label'=>'Active'), - ), - array( - 'page'=>TRUE, - 'type'=>'list', - )), - )); - } - - /** - * Edit a Module Configuration - * - * @todo Highlight those methods that have security, but the class does not have auth_required set to YES or the method isnt defined in secure_actions - */ - public function action_edit() { - $mid = $this->request->param('id'); - $mo = ORM::factory('Module',$mid); - - if (! $mo->loaded()) { - SystemMessage::add(array( - 'title'=>_('Invalid Module ID'), - 'type'=>'error', - 'body'=>sprintf(_('Module with ID %s doesnt appear to exist?'),$mid), - )); - - return; - } - - $output = ''; - $methods = $this->_methods($mo->name); - - // Show methods defined in the DB already. - Block::add(array( - 'title'=>sprintf('%s: %s ',_('Defined Module Methods For'),$mo->display('name')), - 'body'=>Table::display( - $mo->module_method->find_all(), - 25, - array( - 'id'=>array('label'=>'ID','url'=>URL::link('admin','module_method/edit/')), - 'name'=>array('label'=>'Name'), - 'notes'=>array('label'=>'Notes'), - 'menu_display'=>array('label'=>'Menu'), - ), - array( - 'page'=>TRUE, - 'type'=>'list', - )), - )); - - // Show new methods NOT defined in the DB already. - foreach ($mo->module_method->find_all() as $meo) - if (($method = array_search($meo->name,$methods)) !== false) - unset($methods[$method]); - - if (count($methods)) - Block::add(array( - 'title'=>sprintf('%s: %s ',_('Undefined Module Methods For'),$mo->display('name')), - 'body'=>Table::display( - $methods, - 25, - array( - '__VALUE__'=>array('label'=>'Name','url'=>URL::link('admin','module_method/add/'.$mo->id)), - ), - array( - 'page'=>TRUE, - 'type'=>'list', - )), - )); + Block::factory() + ->title('Defined Modules') + ->title_icon('icon-cog') + ->body(Table::factory() + ->data($mo->find_all()) + ->jssort(TRUE) + ->columns(array( + 'id'=>'ID', + 'name'=>'Name', + 'notes'=>'Notes', + 'status(TRUE)'=>'Active', + 'external(TRUE)'=>'External', + )) + ->prepend(array( + 'id'=>array('url'=>URL::link('admin','module/edit/')), + )) + ); } } ?> diff --git a/application/classes/Controller/Admin/Module/Method.php b/application/classes/Controller/Admin/Module/Method.php index 95fcc9d9..3517f0b2 100644 --- a/application/classes/Controller/Admin/Module/Method.php +++ b/application/classes/Controller/Admin/Module/Method.php @@ -18,120 +18,95 @@ class Controller_Admin_Module_Method extends Controller_Admin_Module { $method = $this->request->param('sid'); $mo = ORM::factory('Module',$id); - $mmo = ORM::factory('Module_Method'); + $mm = $this->_methods($mo->name); - if (! $mo->loaded() OR ! in_array($method,$this->_methods($mo->name))) - throw new Kohana_Exception('Method (:method) does not exist in :class',array(':method'=>$method,':class'=>$mo->name)); + if (! $mo->loaded() OR ! in_array($method,$mm['methods'])) + HTTP::redirect(URL::link('admin','module/list')); - $mmo->name = $method; - $mmo->module_id = $mo->id; - $mmo->values($_POST); + if ($_POST) { + $mmo = $mo->module_method; + $mmo->name = $method; + $mmo->module_id = $mo->id; + $mmo->values($_POST); - $output = ''; + if (! $mmo->check() OR ! $mmo->save()) + throw HTTP_Exception::factory(501,'Unable to save data :post',array(':post'=>serialize($_POST))); - if ($_POST AND $mmo->values($_POST)->check()) { - $mmo->save(); + SystemMessage::factory() + ->title('Record added') + ->type('success') + ->body(_('Method record has been added.')); - if ($mmo->saved()) { - SystemMessage::add(array( - 'title'=>_('Method Added'), - 'type'=>'info', - 'body'=>sprintf(_('Method %s defined to database'),$mmo->name), - )); - - HTTP::redirect(URL::link('admin','/module/edit/'.$mo->id)); - - } else { - SystemMessage::add(array( - 'title'=>_('Method Not Saved'), - 'type'=>'error', - 'body'=>sprintf(_('Unable to define Method %s to database?'),$mmo->name), - )); - } + HTTP::redirect(URL::link('admin','/module/edit/'.$mo->id)); } - $output .= View::factory('module/admin/method_add') - ->set('module',$mo) - ->set('method',$mmo); - - Block::add(array( - 'title'=>sprintf(_('Add Method (%s) to Database for (%s)'),strtoupper($mmo->name),strtoupper($mo->name)), - 'body'=>$output, - )); + Block::factory() + ->title(sprintf(_('Add Method (%s) to Database for (%s)'),strtoupper($method),strtoupper($mo->name))) + ->title_icon('icon-plus-sign') + ->type('form-horizontal') + ->body(View::factory('module/method/admin/add') + ->set('name',$method) + ->set('o',$mo) + ); } /** * Edit a Module Configuration - * - * @param int $mid Module ID */ public function action_edit() { - $mid = $this->request->param('id'); - $mmo = ORM::factory('Module_Method',$mid); + $id = $this->request->param('id'); + $mmo = ORM::factory('Module_Method',$id); if (! $mmo->loaded()) { - SystemMessage::add(array( - 'title'=>_('Invalid Method ID'), - 'type'=>'error', - 'body'=>sprintf(_('Method with ID %s doesnt appear to exist?'),$mid), - )); + SystemMessage::factory() + ->title(_('Invalid Method ID')) + ->type('error') + ->body(sprintf(_('Method with ID %s doesnt appear to exist?'),$id)); - return; + HTTP::redirect(URL::link('admin','module/list')); } - $output = ''; - - // The groups that can run this method. - $groups = ORM::factory('Group'); - if ($_POST) { - foreach ($groups->find_all() as $go) { + $mmo->values($_POST); + + if (! $mmo->check() OR ! $mmo->save()) + throw HTTP_Exception::factory(501,'Unable to save data :post',array(':post'=>serialize($_POST))); + + foreach (ORM::factory('Group')->find_all() as $go) { // If the group was defined and no longer if ($mmo->has('group',$go) AND (! isset($_POST['groups']) OR ! in_array($go->id,$_POST['groups']))) { - $gm = ORM::factory('Group_Method',array('method_id'=>$mmo->id,'group_id'=>$go->id)); + $gmo = ORM::factory('Group_Method',array('method_id'=>$mmo->id,'group_id'=>$go->id)); - if (! $gm->delete()) - SystemMessage::add(array( - 'title'=>_('Unable to DELETE Group Method'), - 'type'=>'error', - 'body'=>sprintf(_('Unable to delete Group Method for method %s and group %s'),$mmo->name,$go->name), - )); + if (! $gmo->delete()) + SystemMessage::factory() + ->title(_('Unable to DELETE Group Method')) + ->type('error') + ->body(sprintf(_('Unable to delete Group Method for method %s and group %s'),$mmo->name,$go->name)); // If the group was not defined and now is } elseif (! $mmo->has('group',$go) AND isset($_POST['groups']) AND in_array($go->id,$_POST['groups'])) { - $gm = ORM::factory('Group_Method') + $gmo = ORM::factory('Group_Method') ->values(array( 'method_id'=>$mmo->id, 'group_id'=>$go->id, )); - if (! $gm->check() OR ! $gm->save()) - SystemMessage::add(array( - 'title'=>_('Unable to SAVE Group Method'), - 'type'=>'error', - 'body'=>sprintf(_('Unable to save Group Method for method %s and group %s'),$mmo->name,$go->name), - )); + if (! $gmo->check() OR ! $gmo->save()) + SystemMessage::factory() + ->title(_('Unable to SAVE Group Method')) + ->type('error') + ->body(sprintf(_('Unable to save Group Method for method %s and group %s'),$mmo->name,$go->name)); } } } - $output .= Form::open(); - - $output .= View::factory('module/admin/method_detail_head'); - foreach ($groups->find_all() as $go) { - $output .= View::factory('module/admin/method_detail_body') - ->set('group',$go) - ->set('defined',$mmo->has('group',$go)); - } - $output .= View::factory('module/admin/method_detail_foot'); - - $output .= '
'.Form::submit('submit',_('Update'),array('class'=>'form_button')).'
'; - $output .= Form::close(); - - Block::add(array( - 'title'=>sprintf(_('%s->%s Method'),strtoupper($mmo->module->name),strtoupper($mmo->name)), - 'body'=>$output, - )); + Block::factory() + ->title(sprintf(_('Configure access to method (%s::%s)'),$mmo->controller(),$mmo->method())) + ->title_icon('icon-plus-sign') + ->type('form') + ->body(View::factory('module/method/admin/edit') + ->set('o',$mmo) + ); } } ?> diff --git a/application/classes/Controller/Reseller/Account.php b/application/classes/Controller/Reseller/Account.php index 46225c58..7f33c719 100644 --- a/application/classes/Controller/Reseller/Account.php +++ b/application/classes/Controller/Reseller/Account.php @@ -90,7 +90,6 @@ class Controller_Reseller_Account extends Controller_Account { ->span(6) ->body(Table::factory() ->data($ao->service->list_active()) - ->jssort('service') ->columns(array( 'id'=>'ID', 'service_name()'=>'Service', diff --git a/application/classes/Controller/User/Welcome.php b/application/classes/Controller/User/Welcome.php index f6ed6883..02c32aad 100644 --- a/application/classes/Controller/User/Welcome.php +++ b/application/classes/Controller/User/Welcome.php @@ -22,7 +22,6 @@ class Controller_User_Welcome extends Controller_Welcome { ->span(6) ->body(Table::factory() ->data($this->ao->service->list_active()) - ->jssort('service') ->columns(array( 'id'=>'ID', 'service_name()'=>'Service', diff --git a/application/classes/Model/Auth/RoleDefault.php b/application/classes/Model/Auth/RoleDefault.php index 57d29408..20297fec 100644 --- a/application/classes/Model/Auth/RoleDefault.php +++ b/application/classes/Model/Auth/RoleDefault.php @@ -9,5 +9,19 @@ * @license http://dev.osbill.net/license.html */ class Model_Auth_RoleDefault extends Model_Auth_Role { + /** + * Show a bootstrap label button for a field with a boolean value + */ + public function label_bool($column,$render=FALSE) { + if (! isset($this->_table_columns[$column])) + return NULL; + + if (! $render) + return $this->display($column); + + return View::factory(Config::theme().'/label/bool') + ->set('label',$this->$column ? 'label-success' : '') + ->set('column',$this->display($column)); + } } ?> diff --git a/application/classes/Model/Module.php b/application/classes/Model/Module.php index df0b1893..97479f5b 100644 --- a/application/classes/Model/Module.php +++ b/application/classes/Model/Module.php @@ -21,11 +21,13 @@ class Model_Module extends ORM_OSB { 'module_method'=>array('far_key'=>'id'), ); protected $_sorting = array( - 'status'=>'DESC', 'name'=>'ASC', ); protected $_display_filters = array( + 'external'=>array( + array('StaticList_YesNo::get',array(':value')), + ), 'name'=>array( array('strtoupper',array(':value')), ), @@ -34,6 +36,10 @@ class Model_Module extends ORM_OSB { ), ); + public function external($render=FALSE) { + return $this->label_bool('external',$render); + } + /** * Return an instance of this Module's Model * diff --git a/application/classes/Model/Module/Method.php b/application/classes/Model/Module/Method.php index 81bcac2d..79c001e3 100644 --- a/application/classes/Model/Module/Method.php +++ b/application/classes/Model/Module/Method.php @@ -29,6 +29,16 @@ class Model_Module_Method extends ORM_OSB { 'name'=>'ASC', ); + protected $status; + + public function controller() { + return Kohana::classname(sprintf('Controller%s_%s',($this->directory() ? '_' : '').$this->directory(),$this->module->name)); + } + + public function directory() { + return substr($this->name,0,strpos($this->name,'_')); + } + /** * Calculate the description for this method on any menu link */ @@ -40,6 +50,17 @@ class Model_Module_Method extends ORM_OSB { return sprintf('%s: %s',$this->module->name,$this->name); } + public function method() { + return substr($this->name,strpos($this->name,'_')+1); + } + + public function status($status=NULL) { + if ($status) + $this->status = $status; + + return $this->status; + } + public function url() { if (! preg_match('/_/',$this->name)) return NULL; diff --git a/application/classes/ORM/OSB.php b/application/classes/ORM/OSB.php index 0237aed2..2abb3add 100644 --- a/application/classes/ORM/OSB.php +++ b/application/classes/ORM/OSB.php @@ -171,6 +171,21 @@ abstract class ORM_OSB extends ORM { return array_key_exists($key,$this->$column) ? $this->{$column}[$key] : NULL; } + /** + * Show a bootstrap label button for a field with a boolean value + */ + public function label_bool($column,$render=FALSE) { + if (! isset($this->_table_columns[$column])) + return NULL; + + if (! $render) + return $this->display($column); + + return View::factory(Config::theme().'/label/bool') + ->set('label',$this->$column ? 'label-success' : '') + ->set('column',$this->display($column)); + } + final public function module() { return ORM::factory(Kohana::classname($this->name)); } @@ -223,15 +238,7 @@ abstract class ORM_OSB extends ORM { } public function status($render=FALSE) { - if (! isset($this->_table_columns['status'])) - return NULL; - - if (! $render) - return $this->display('status'); - - return View::factory(Config::theme().'/status') - ->set('label',$this->status ? 'label-success' : '') - ->set('status',$this->display('status')); + return $this->label_bool('status',$render); } /** diff --git a/application/views/module/admin/method_add.php b/application/views/module/admin/method_add.php deleted file mode 100644 index 8934ada1..00000000 --- a/application/views/module/admin/method_add.php +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - -
Modulename; ?>
Namename; ?>
Notesname); ?>
Menu Display
-'form_button')); ?> - diff --git a/application/views/module/admin/method_detail_body.php b/application/views/module/admin/method_detail_body.php deleted file mode 100644 index bf364d03..00000000 --- a/application/views/module/admin/method_detail_body.php +++ /dev/null @@ -1,8 +0,0 @@ - - - display('name'); ?> - - display('notes'); ?> - display('status'); ?> - id,$defined); ?> - diff --git a/application/views/module/admin/method_detail_foot.php b/application/views/module/admin/method_detail_foot.php deleted file mode 100644 index 000ca4b0..00000000 --- a/application/views/module/admin/method_detail_foot.php +++ /dev/null @@ -1 +0,0 @@ - diff --git a/application/views/module/admin/method_detail_head.php b/application/views/module/admin/method_detail_head.php deleted file mode 100644 index b0b73358..00000000 --- a/application/views/module/admin/method_detail_head.php +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/application/views/module/method/admin/add.php b/application/views/module/method/admin/add.php new file mode 100644 index 00000000..77aec032 --- /dev/null +++ b/application/views/module/method/admin/add.php @@ -0,0 +1,18 @@ +
+
+
+ Add Method + + 'Method','disabled')); ?> + 'Description','placeholder'=>'Method Description','class'=>'span8')); ?> + 'Menu Title','placeholder'=>'Menu Title')); ?> + +
+
+ + +
+
+
+
+
diff --git a/application/views/module/method/admin/edit.php b/application/views/module/method/admin/edit.php new file mode 100644 index 00000000..f3e6327c --- /dev/null +++ b/application/views/module/method/admin/edit.php @@ -0,0 +1,47 @@ +
+
+
+ Configure Method + + notes,array('label'=>'Description','placeholder'=>'Method Description','class'=>'span8')); ?> + menu_display,array('label'=>'Menu Title','placeholder'=>'Menu Title')); ?> + +
+
+
+ +
+
+
+ Configure Method Security + +
MethodNotesGroup ActiveMethod Enabled
+ + + + + + + + + find_all() as $go) : ?> + + + + + + + + +
MethodNotesGroup ActiveMethod Enable
id,TRUE),$go->display('name')); ?>display('notes'); ?>label_bool('status',TRUE); ?>id,$o->has('group',$go)); ?>
+ +
+
+ + +
+
+ + + + diff --git a/modules/export/views/export/admin/add.php b/modules/export/views/export/admin/add.php index 73f6cadb..2f407581 100644 --- a/modules/export/views/export/admin/add.php +++ b/modules/export/views/export/admin/add.php @@ -3,8 +3,6 @@
Add Export Data Map -

Available module->table_name(); ?> Columns to display

- list_itemsnoexport($module,$emo->id),NULL,array('label'=>'Product')); ?> 'Accounting Code','placeholder'=>'Account Code')); ?> 'Inventory Code','placeholder'=>'Inventory Code')); ?> diff --git a/modules/lnApp b/modules/lnApp index ab1adad4..8ba0ced1 160000 --- a/modules/lnApp +++ b/modules/lnApp @@ -1 +1 @@ -Subproject commit ab1adad456578500a4be8edd8635c560e25417f7 +Subproject commit 8ba0ced1911cc1a824088a28a4008cf647de9f41