commit dbc31a734259153a0433b44e04da354da822cd33
parent 6385d7cb652e7d6287396126ff99a0d79ee40c45
Author: Timo A. Hummel <timo@netraver.de>
Date: Mon, 6 Jun 2011 22:38:12 +0200
Added user management
Diffstat:
9 files changed, 243 insertions(+), 1 deletion(-)
diff --git a/frontend/index.html b/frontend/index.html
@@ -51,6 +51,7 @@
<script type="text/javascript" src="js/Models/Distributor.js"></script>
<script type="text/javascript" src="js/Models/Manufacturer.js"></script>
<script type="text/javascript" src="js/Models/ManufacturerICLogo.js"></script>
+ <script type="text/javascript" src="js/Models/User.js"></script>
<script type="text/javascript" src="js/Models/Category.js"></script>
<script type="text/javascript" src="js/Models/Part.js"></script>
<script type="text/javascript" src="js/Models/PartDistributor.js"></script>
@@ -93,6 +94,10 @@
<script type="text/javascript" src="js/Components/CategoryEditor/CategoryEditorWindow.js"></script>
<script type="text/javascript" src="js/Components/CategoryEditor/CategoryEditorTree.js"></script>
+ <script type="text/javascript" src="js/Components/User/UserEditor.js"></script>
+ <script type="text/javascript" src="js/Components/User/UserEditorComponent.js"></script>
+ <script type="text/javascript" src="js/Components/User/UserGrid.js"></script>
+
<script type="text/javascript" src="js/Components/Part/PartsManager.js"></script>
<script type="text/javascript" src="js/Components/Part/PartsGrid.js"></script>
<script type="text/javascript" src="js/Components/Part/PartDistributorGrid.js"></script>
diff --git a/frontend/js/Components/MenuBar.js b/frontend/js/Components/MenuBar.js
@@ -16,6 +16,10 @@ Ext.define('PartDB2.MenuBar', {
},{
text: i18n('Edit Distributors'),
handler: this.editDistributors
+ },{
+ text: i18n('Edit Users'),
+ handler: this.editUsers,
+ icon: "resources/silkicons/user.png"
}]
});
@@ -63,6 +67,15 @@ Ext.define('PartDB2.MenuBar', {
PartDB2.getApplication().addItem(j);
j.show();
+ },
+ editUsers: function () {
+ var j = Ext.create("PartDB2.UserEditorComponent", {
+ title: i18n("Users"),
+ closable: true
+ });
+
+ PartDB2.getApplication().addItem(j);
+ j.show();
}
});
\ No newline at end of file
diff --git a/frontend/js/Components/User/UserEditor.js b/frontend/js/Components/User/UserEditor.js
@@ -0,0 +1,16 @@
+Ext.define('PartDB2.UserEditor', {
+ extend: 'PartDB2.Editor',
+ alias: 'widget.UserEditor',
+ items: [{
+ xtype: 'textfield',
+ name: 'username',
+ fieldLabel: i18n("User")
+ },{
+ xtype: 'textfield',
+ inputType: "password",
+ name: 'password',
+ fieldLabel: i18n("Password")
+ }],
+ saveText: i18n("Save User"),
+ model: 'PartDB2.User'
+});
diff --git a/frontend/js/Components/User/UserEditorComponent.js b/frontend/js/Components/User/UserEditorComponent.js
@@ -0,0 +1,20 @@
+Ext.define('PartDB2.UserEditorComponent', {
+ extend: 'PartDB2.EditorComponent',
+ alias: 'widget.UserEditorComponent',
+ gridClass: 'PartDB2.UserGrid',
+ editorClass: 'PartDB2.UserEditor',
+ newItemText: i18n("New User"),
+ deleteMessage: i18n("Do you really wish to delete the user '%s'?"),
+ deleteTitle: i18n("Delete User"),
+ initComponent: function () {
+ this.createStore({
+ model: "User",
+ sorters: [{
+ property: 'username',
+ direction:'ASC'
+ }]
+ });
+
+ this.callParent();
+ }
+});+
\ No newline at end of file
diff --git a/frontend/js/Components/User/UserGrid.js b/frontend/js/Components/User/UserGrid.js
@@ -0,0 +1,9 @@
+Ext.define('PartDB2.UserGrid', {
+ extend: 'PartDB2.EditorGrid',
+ alias: 'widget.UserGrid',
+ columns: [
+ {header: i18n("User"), dataIndex: 'username', flex: 1}
+ ],
+ addButtonText: i18n("Add User"),
+ deleteButtonText: i18n("Delete User")
+});+
\ No newline at end of file
diff --git a/frontend/js/Models/User.js b/frontend/js/Models/User.js
@@ -0,0 +1,11 @@
+PartDB2.User = Ext.define("User", {
+ extend: "Ext.data.Model",
+ fields: [
+ { id: 'id', name: 'id', type: 'int' },
+ { name: 'username', type: 'string'}
+ ],
+ proxy: PartDB2.getRESTProxy("User"),
+ getName: function () {
+ return this.get("username");
+ }
+});+
\ No newline at end of file
diff --git a/src/de/RaumZeitLabor/PartDB2/Auth/User.php b/src/de/RaumZeitLabor/PartDB2/Auth/User.php
@@ -12,7 +12,7 @@ class User {
*/
private $id;
- /** @Column(length=50) */
+ /** @Column(length=50,unique=true) */
private $username;
/** @Column(length=32) */
@@ -135,5 +135,27 @@ class User {
}
}
+ /**
+ * Returns the ID of this object.
+ * @param none
+ * @return int The ID of this object
+ */
+ public function getId () {
+ return $this->id;
+ }
+
+ /**
+ * Serializes the user object and returns it as array, suitable
+ * to process via json_encode.
+ * @param none
+ * @return array An array containing the object information
+ */
+ public function serialize () {
+ return array(
+ "id" => $this->getId(),
+ "username" => $this->getUsername()
+ );
+ }
+
}
?>
\ No newline at end of file
diff --git a/src/de/RaumZeitLabor/PartDB2/User/UserManager.php b/src/de/RaumZeitLabor/PartDB2/User/UserManager.php
@@ -0,0 +1,64 @@
+<?php
+namespace de\RaumZeitLabor\PartDB2\User;
+declare(encoding = 'UTF-8');
+
+use de\RaumZeitLabor\PartDB2\Util\Singleton,
+ de\RaumZeitLabor\PartDB2\Auth\User,
+ de\RaumZeitLabor\PartDB2\PartDB2,
+ de\RaumZeitLabor\PartDB2\Category\CategoryManager,
+ de\RaumZeitLabor\PartDB2\User\Exceptions\UserNotFoundException;
+
+class UserManager extends Singleton {
+ public function getUsers ($start = 0, $limit = 10, $sort = "name", $dir = "asc", $filter = "") {
+
+ $qb = PartDB2::getEM()->createQueryBuilder();
+ $qb->select("st.id, st.username")->from("de\RaumZeitLabor\PartDB2\Auth\User","st");
+
+ if ($filter != "") {
+ $qb = $qb->where("st.username LIKE :filter");
+ $qb->setParameter("filter", "%".$filter."%");
+ }
+
+ if ($limit > -1) {
+ $qb->setMaxResults($limit);
+ $qb->setFirstResult($start);
+ }
+
+ $qb->orderBy("st.".$sort, $dir);
+
+ $query = $qb->getQuery();
+
+ $result = $query->getResult();
+
+ $totalQueryBuilder = PartDB2::getEM()->createQueryBuilder();
+ $totalQueryBuilder->select("COUNT(st.id)")->from("de\RaumZeitLabor\PartDB2\Auth\User","st");
+
+
+
+ if ($filter != "") {
+ $totalQueryBuilder = $totalQueryBuilder->where("st.name LIKE :filter");
+ $totalQueryBuilder->setParameter("filter", "%".$filter."%");
+ }
+
+ $totalQuery = $totalQueryBuilder->getQuery();
+
+ return array("data" => $result, "totalCount" => $totalQuery->getSingleScalarResult());
+ }
+
+ public function getUser ($id) {
+ $user = PartDB2::getEM()->find("de\RaumZeitLabor\PartDB2\Auth\User", $id);
+
+ if ($user) {
+ return $user;
+ } else {
+ throw new UserNotFoundException();
+ }
+ }
+
+ public function deleteUser ($id) {
+ $user = $this->getUser($id);
+
+ PartDB2::getEM()->remove($user);
+ PartDB2::getEM()->flush();
+ }
+}+
\ No newline at end of file
diff --git a/src/de/RaumZeitLabor/PartDB2/User/UserService.php b/src/de/RaumZeitLabor/PartDB2/User/UserService.php
@@ -0,0 +1,77 @@
+<?php
+namespace de\RaumZeitLabor\PartDB2\User;
+use de\RaumZeitLabor\PartDB2\Service\RestfulService;
+
+declare(encoding = 'UTF-8');
+
+use de\RaumZeitLabor\PartDB2\Service\Service;
+use de\RaumZeitLabor\PartDB2\PartDB2,
+ de\RaumZeitLabor\PartDB2\Auth\User,
+ de\RaumZeitLabor\PartDB2\Session\SessionManager;
+
+class UserService extends Service implements RestfulService {
+ public function get () {
+ if ($this->hasParameter("id")) {
+ return UserManager::getInstance()->getUser($this->getParameter("id"))->serialize();
+ } else {
+ if ($this->hasParameter("sort")) {
+ $tmp = json_decode($this->getParameter("sort"), true);
+
+ $aSortParams = $tmp[0];
+ } else {
+ $aSortParams = array(
+ "property" => "username",
+ "direction" => "ASC");
+ }
+ return UserManager::getInstance()->getUsers(
+ $this->getParameter("start", $this->getParameter("start", 0)),
+ $this->getParameter("limit", $this->getParameter("limit", 25)),
+ $this->getParameter("sortby", $aSortParams["property"]),
+ $this->getParameter("dir", $aSortParams["direction"]),
+ $this->getParameter("query", ""));
+ }
+ }
+
+ public function create () {
+ $this->requireParameter("username");
+
+ $user = new User;
+
+ $this->setUserData($user);
+
+ PartDB2::getEM()->persist($user);
+ PartDB2::getEM()->flush();
+
+ return array("data" => $user->serialize());
+ }
+
+ private function setUserData (User $user) {
+ $user->setUsername($this->getParameter("username"));
+
+ if ($this->hasParameter("password") && $this->getParameter("password") !== "") {
+ $user->setHashedPassword($this->getParameter("password"));
+ } else {
+ $user->setHashedPassword("");
+ }
+ }
+
+ public function update () {
+ $this->requireParameter("id");
+ $this->requireParameter("username");
+ $user = UserManager::getInstance()->getUser($this->getParameter("id"));
+
+ $this->setUserData($user);
+ PartDB2::getEM()->flush();
+
+ return array("data" => $user->serialize());
+
+ }
+
+ public function destroy () {
+ $this->requireParameter("id");
+
+ UserManager::getInstance()->deleteUser($this->getParameter("id"));
+
+ return array("data" => null);
+ }
+}+
\ No newline at end of file