From 4090bd1618dcd8a0ce7b17ddc66108ee06680745 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Wed, 8 Jan 2020 13:04:51 +0100 Subject: [PATCH] UsersGroups table added to config DB, User and Group have ManyToMany relation, ver. 2.25.1400 --- Config/Entities/Group.cs | 11 ++- Config/FluentCommon.cs | 50 +++++++------ Config/Mappings/GroupMap.cs | 12 ++- Config/Mappings/UserMap.cs | 7 +- Config/Properties/AssemblyInfo.cs | 4 +- Results/Properties/AssemblyInfo.cs | 4 +- TBF/Properties/AssemblyInfo.cs | 4 +- UserManagement/Properties/AssemblyInfo.cs | 4 +- Users/Entities/Group.cs | 13 +++- Users/Entities/User.cs | 4 +- Users/Forms/EditSelectedUser.cs | 38 ++++------ Users/Forms/UserManagementDlg.cs | 89 +++++++---------------- Users/Mappings/GroupMap.cs | 12 ++- Users/Mappings/UserMap.cs | 7 +- Users/Properties/AssemblyInfo.cs | 4 +- 15 files changed, 130 insertions(+), 133 deletions(-) diff --git a/Config/Entities/Group.cs b/Config/Entities/Group.cs index 854276604..755e45a18 100644 --- a/Config/Entities/Group.cs +++ b/Config/Entities/Group.cs @@ -1,7 +1,8 @@ /// -/// Copyright (c) 2013-2019 Sensus Slovensko a.s. +/// Copyright (c) 2013-2020 Sensus Slovensko a.s. /// using System; +using System.Collections.Generic; namespace Config.Entities { @@ -9,14 +10,18 @@ namespace Config.Entities { public virtual int Id { get; protected set; } public virtual Users.Entities.GID GID { get; set; } + public virtual long AccessFlags { get; set; } /// Bitfield of access flags: bit0 .. bit62 + public virtual IList Users { get; set; } /// Group can be a member of a list of users public Group() { + Users = new List(); } public Group(Users.Entities.GID gid) - { + : this() + { GID = gid; } - } + } } diff --git a/Config/FluentCommon.cs b/Config/FluentCommon.cs index aea33ca46..62e5f31f8 100644 --- a/Config/FluentCommon.cs +++ b/Config/FluentCommon.cs @@ -145,17 +145,8 @@ namespace Config using (var transaction = session.BeginTransaction()) { /// - /// Prepare all groups + /// Create user 'admin' /// - var testers = new Config.Entities.Group(Users.Entities.GID.Testers); - var testingSpecialists = new Config.Entities.Group(Users.Entities.GID.TestingSpecialists); - var headOfLab = new Config.Entities.Group(Users.Entities.GID.HeadOfLab); - var maintenanceSpecialists = new Config.Entities.Group(Users.Entities.GID.MaintenanceSpecialists); - var metrologists = new Config.Entities.Group(Users.Entities.GID.Metrologists); - var calibrationSpecialists = new Config.Entities.Group(Users.Entities.GID.CalibrationSpecialists); - var administrators = new Config.Entities.Group(Users.Entities.GID.Administrators); - - /// Create the user 'admin' add his groups var admin = new Config.Entities.User { UserName = Data.AdminUsername, @@ -163,20 +154,35 @@ namespace Config LastPwChange = DateTime.Now }; admin.SetPassword(Data.AdminPassword); - admin.AddGroup(testers); - admin.AddGroup(testingSpecialists); - admin.AddGroup(headOfLab); - admin.AddGroup(maintenanceSpecialists); - admin.AddGroup(metrologists); - admin.AddGroup(calibrationSpecialists); - admin.AddGroup(administrators); - session.SaveOrUpdate(admin); - - ///// Create the control board component - //var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity(); - //session.SaveOrUpdate(cmpnt); + /// + /// Prepare all groups, add some of them to admin + /// + for (Users.Entities.GID gid = 0; gid < Users.Entities.GID.NrOfGroups; gid++) + { + Config.Entities.Group group = new Config.Entities.Group(gid); + switch (gid) + { + case Users.Entities.GID.Testers: + case Users.Entities.GID.TestingSpecialists: + case Users.Entities.GID.HeadOfLab: + case Users.Entities.GID.MaintenanceSpecialists: + case Users.Entities.GID.Metrologists: + case Users.Entities.GID.CalibrationSpecialists: + case Users.Entities.GID.Administrators: +#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL + case Users.Entities.GID.TraceabilityManagement: +#elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_END + case Users.Entities.GID.MetrologicalAuthority: + case Users.Entities.GID.WaterMeterAuthority: +#endif + admin.AddGroup(group); + session.SaveOrUpdate(group); /// Save this group + break; + } + } + session.SaveOrUpdate(admin); /// Save user 'admin' transaction.Commit(); } } diff --git a/Config/Mappings/GroupMap.cs b/Config/Mappings/GroupMap.cs index a18e5b623..36118e7bb 100644 --- a/Config/Mappings/GroupMap.cs +++ b/Config/Mappings/GroupMap.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2019 Sensus Slovensko a.s. +/// Copyright (c) 2013-2020 Sensus Slovensko a.s. /// using FluentNHibernate.Mapping; @@ -7,10 +7,18 @@ namespace Config.Mappings { class GroupMap : ClassMap { + /// + /// https://stackoverflow.com/questions/9108083/fluent-nhibernate-many-to-many-mapping-way/9125059 + /// public GroupMap() { Id(x => x.Id); - Map(x => x.GID).Column("Name"); ; + Map(x => x.GID).Column("Name"); + Map(x => x.AccessFlags); + HasManyToMany(x => x.Users) + .Cascade.SaveUpdate() + .Inverse() + .Table("UsersGroups"); } } } diff --git a/Config/Mappings/UserMap.cs b/Config/Mappings/UserMap.cs index b46ca11d1..dc0527a4f 100644 --- a/Config/Mappings/UserMap.cs +++ b/Config/Mappings/UserMap.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2016-2019 Sensus Slovensko a.s. +/// Copyright (c) 2016-2020 Sensus Slovensko a.s. /// using FluentNHibernate.Mapping; @@ -19,8 +19,9 @@ namespace Config.Mappings Map(x => x.Password4); Map(x => x.FullName).Column("Description"); Map(x => x.LastPwChange); - HasMany(x => x.Groups) - .Cascade.All(); + HasManyToMany(x => x.Groups) + .Cascade.SaveUpdate() + .Table("UsersGroups"); } } } diff --git a/Config/Properties/AssemblyInfo.cs b/Config/Properties/AssemblyInfo.cs index bae1033f2..dd74a677f 100644 --- a/Config/Properties/AssemblyInfo.cs +++ b/Config/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.24.1382.0")] -[assembly: AssemblyFileVersion("2.24.1382.0")] +[assembly: AssemblyVersion("2.25.1400.0")] +[assembly: AssemblyFileVersion("2.25.1400.0")] diff --git a/Results/Properties/AssemblyInfo.cs b/Results/Properties/AssemblyInfo.cs index 8e86a1999..a208ca4c0 100644 --- a/Results/Properties/AssemblyInfo.cs +++ b/Results/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.24.1390.0")] -[assembly: AssemblyFileVersion("2.24.1390.0")] +[assembly: AssemblyVersion("2.25.1400.0")] +[assembly: AssemblyFileVersion("2.25.1400.0")] diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 7df6c0ad6..94479af76 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.24.1391.0")] -[assembly: AssemblyFileVersion("2.24.1391.0")] +[assembly: AssemblyVersion("2.25.1400.0")] +[assembly: AssemblyFileVersion("2.25.1400.0")] diff --git a/UserManagement/Properties/AssemblyInfo.cs b/UserManagement/Properties/AssemblyInfo.cs index df4f011c3..dd2c5b145 100644 --- a/UserManagement/Properties/AssemblyInfo.cs +++ b/UserManagement/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.24.1368.0")] -[assembly: AssemblyFileVersion("2.24.1368.0")] +[assembly: AssemblyVersion("2.25.1400.0")] +[assembly: AssemblyFileVersion("2.25.1400.0")] diff --git a/Users/Entities/Group.cs b/Users/Entities/Group.cs index 7ac7426f7..67d08d470 100644 --- a/Users/Entities/Group.cs +++ b/Users/Entities/Group.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2016-2019 Sensus Slovensko a.s. +/// Copyright (c) 2016-2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -11,16 +11,25 @@ namespace Users.Entities { public virtual int Id { get; protected set; } public virtual GID GID { get; set; } + public virtual long AccessFlags { get; set; } /// Bitfield of access flags: bit0 .. bit62 + public virtual IList Users { get; set; } /// Group can be a member of a list of users public Group() { - } + Users = new List(); + } public Group(GID gid) + : this() { GID = gid; } + public virtual string Gid2Str() + { + return Group.Gid2Str(this.GID); + } + public static string Gid2Str(GID gid) { switch (gid) diff --git a/Users/Entities/User.cs b/Users/Entities/User.cs index 7cb79e96e..70cf71de0 100644 --- a/Users/Entities/User.cs +++ b/Users/Entities/User.cs @@ -87,7 +87,7 @@ namespace Users.Entities { return true; } - else if ((groupId >= 0) && (groupId < GID.NrOfGroups) && (Groups != null)) + else if ((groupId >= 0) && (groupId < GID.NrOfGroups)) { foreach (var g in Groups) { @@ -113,7 +113,7 @@ namespace Users.Entities foreach (var gid in groupIds) { - if (gid >= 0 && gid < GID.NrOfGroups) + if ((gid >= 0) && (gid < GID.NrOfGroups)) { /// for all group elements in User.Groups foreach (var grp in Groups) diff --git a/Users/Forms/EditSelectedUser.cs b/Users/Forms/EditSelectedUser.cs index 9a59515fb..a7a21c744 100644 --- a/Users/Forms/EditSelectedUser.cs +++ b/Users/Forms/EditSelectedUser.cs @@ -17,7 +17,7 @@ namespace Users.Forms { NHibernate.ISession session; User user; - GID[] displayedGIDs; + IList displayedGroups; bool[] oriGroupMember; /// index is gid, size is Grp.Count @@ -32,18 +32,18 @@ namespace Users.Forms { InitializeComponent(); this.toolTip1.SetToolTip(this.txtName, string.Format(Strings.max_0_alphanum_chars, 20)); - oriGroupMember = new bool[(displayedGIDs != null) ? displayedGIDs.Length : 0]; + oriGroupMember = new bool[(displayedGroups != null) ? displayedGroups.Count : 0]; okBtn.Enabled = false; } - public EditSelectedUser(NHibernate.ISession session, User user, GID[] displayedGIDs) + public EditSelectedUser(NHibernate.ISession session, User user, IList displayedGroups) : this() { this.session = session; this.user = user; - this.displayedGIDs = displayedGIDs; + this.displayedGroups = displayedGroups; - oriGroupMember = new bool[(displayedGIDs != null) ? displayedGIDs.Length : 0]; + oriGroupMember = new bool[(displayedGroups != null) ? displayedGroups.Count : 0]; } private void EditSelectedUser_Load(object sender, EventArgs e) @@ -124,12 +124,12 @@ namespace Users.Forms public void ShowGroups() { checkedListBoxGroups.Items.Clear(); - for (int i= 0; i < displayedGIDs.Length; i++) + for (int i= 0; i < displayedGroups.Count; i++) { - GID gid = displayedGIDs[i]; + Group group = displayedGroups[i]; - bool boolIsMember = oriGroupMember[i] = user.IsMemberOf(gid); - checkedListBoxGroups.Items.Add(Group.Gid2Str(gid)); + bool boolIsMember = oriGroupMember[i] = user.IsMemberOf(group.GID); + checkedListBoxGroups.Items.Add(group.Gid2Str()); checkedListBoxGroups.SetItemCheckState(i, boolIsMember ? CheckState.Checked : CheckState.Unchecked); } } @@ -189,30 +189,22 @@ namespace Users.Forms user.LastPwChange = DateTime.MinValue; } + /// /// Groups + /// IList groups = user.Groups; /// = session.QueryOver().Where(x => (x.User.Id == user.Id)).List(); - for (int i = 0; i < displayedGIDs.Length; i++ ) + for (int i = 0; i < displayedGroups.Count; i++ ) { - GID gid = displayedGIDs[i]; + Group group = displayedGroups[i]; bool newIsMember = checkedListBoxGroups.GetItemChecked(i); if (!newIsMember && oriGroupMember[i]) { - for (int j = 0; j < user.Groups.Count; j++) - { - Group grp = user.Groups[j]; - if (grp.GID == gid) - { - session.Delete(user.Groups[j]); - user.Groups.RemoveAt(j); - break; - } - } + user.Groups.Remove(group); } else if (newIsMember && !oriGroupMember[i]) { - Group newGroup = new Group(gid); - user.Groups.Add(newGroup); + user.Groups.Add(group); } } diff --git a/Users/Forms/UserManagementDlg.cs b/Users/Forms/UserManagementDlg.cs index 4f97d6c8b..29a7c3117 100644 --- a/Users/Forms/UserManagementDlg.cs +++ b/Users/Forms/UserManagementDlg.cs @@ -26,39 +26,7 @@ namespace Users.Forms const int NameSurnameColumn = 2; - static GID[] DisplayedGIDs = new GID[] - { -#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL - GID.Testers, - GID.TestingSpecialists, - GID.HeadOfLab, - GID.MaintenanceSpecialists, - GID.Metrologists, - GID.CalibrationSpecialists, - GID.Administrators, - GID.TraceabilityManagement, -#elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_END - GID.Testers, - GID.TestingSpecialists, - GID.HeadOfLab, - GID.MaintenanceSpecialists, - GID.Metrologists, - GID.CalibrationSpecialists, - GID.Administrators, - GID.MetrologicalAuthority, - GID.WaterMeterAuthority, -#else - GID.Testers, - GID.TestingSpecialists, - GID.HeadOfLab, - GID.MaintenanceSpecialists, - GID.Metrologists, - GID.CalibrationSpecialists, - GID.Administrators, -#endif - }; - - + IList displayedGroups; public string TitleExtension; @@ -77,6 +45,17 @@ namespace Users.Forms this.session = session; this.showExtensions = showLocalExtensions; if (showLocalExtensions) copyFromRemoteButton.Visible = true; + + try + { + displayedGroups = session.QueryOver().List(); + listOfUsers = session.QueryOver().List(); + } + catch (Exception) + { + if (displayedGroups == null) displayedGroups = new List(); + if (listOfUsers == null) listOfUsers = new List(); + } } private void UserManagementDlg_Load(object sender, EventArgs e) @@ -97,47 +76,35 @@ namespace Users.Forms listViewUsers.Columns.Add(Strings.Tag, 110); listViewUsers.Columns.Add(Strings.Groups, 370); - try - { - listOfUsers = session.QueryOver().List(); - } - catch (Exception exc) - { - string msg = exc.Message; - } - ListUsers(); } public void ListUsers() { - Cursor.Current = Cursors.WaitCursor; - listViewUsers.Items.Clear(); foreach (User u in listOfUsers) { + ListViewItem item = new ListViewItem(u.UserName); + item.Tag = u; + item.SubItems.Add(u.Number.ToString()); + item.SubItems.Add(u.FullName); + item.SubItems.Add(string.IsNullOrEmpty(u.Tag) ? string.Empty : u.Tag); + + /// Show groups of this user string grps = string.Empty; - /// - foreach (var gid in DisplayedGIDs) + foreach (var group in displayedGroups) { - if (u.IsMemberOf(gid)) + if (u.IsMemberOf(group.GID)) { if (!string.IsNullOrEmpty(grps)) grps += ", "; - grps += Group.Gid2Str(gid); + grps += group.Gid2Str(); } } - - ListViewItem item = new ListViewItem(u.UserName); - item.SubItems.Add(u.Number.ToString()); - item.SubItems.Add(u.FullName); - item.SubItems.Add(string.IsNullOrEmpty(u.Tag) ? string.Empty : u.Tag); item.SubItems.Add(grps); - item.Tag = u; + this.listViewUsers.Items.Add(item); } this.listViewUsers.Refresh(); - - Cursor.Current = Cursors.Default; } private void closeButton_Click(object sender, EventArgs e) @@ -209,7 +176,7 @@ namespace Users.Forms { if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User) { - new Forms.EditSelectedUser(session, (User)listViewUsers.SelectedItems[0].Tag, DisplayedGIDs).ShowDialog(); + new Forms.EditSelectedUser(session, (User)listViewUsers.SelectedItems[0].Tag, displayedGroups).ShowDialog(); ListUsers(); } } @@ -222,7 +189,7 @@ namespace Users.Forms private void addButton_Click(object sender, EventArgs e) { User newUser = new User(); - if (new Forms.EditSelectedUser(session, newUser, DisplayedGIDs).ShowDialog() == DialogResult.OK) + if (new Forms.EditSelectedUser(session, newUser, displayedGroups).ShowDialog() == DialogResult.OK) { listOfUsers.Add(newUser); } @@ -233,10 +200,10 @@ namespace Users.Forms { if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User) { - User Selecteduser = listViewUsers.SelectedItems[0].Tag as User; - session.Delete(Selecteduser); + User selecteduser = session.Get((listViewUsers.SelectedItems[0].Tag as User).Id); + session.Delete(selecteduser); session.Flush(); - listOfUsers.Remove(Selecteduser); + listOfUsers.RemoveAt(listViewUsers.SelectedIndices[0]); ListUsers(); } } diff --git a/Users/Mappings/GroupMap.cs b/Users/Mappings/GroupMap.cs index 24023a68a..76895cd88 100644 --- a/Users/Mappings/GroupMap.cs +++ b/Users/Mappings/GroupMap.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2016-2019 Sensus Slovensko a.s. +/// Copyright (c) 2016-2020 Sensus Slovensko a.s. /// using FluentNHibernate.Mapping; @@ -7,10 +7,18 @@ namespace Users.Mappings { class GroupMap : ClassMap { + /// + /// https://stackoverflow.com/questions/9108083/fluent-nhibernate-many-to-many-mapping-way/9125059 + /// public GroupMap() { Id(x => x.Id); - Map(x => x.GID).Column("Name"); ; + Map(x => x.GID).Column("Name"); + Map(x => x.AccessFlags); + HasManyToMany(x => x.Users) + .Cascade.SaveUpdate() + .Inverse() + .Table("UsersGroups"); } } } diff --git a/Users/Mappings/UserMap.cs b/Users/Mappings/UserMap.cs index b27bbd91d..475506e4d 100644 --- a/Users/Mappings/UserMap.cs +++ b/Users/Mappings/UserMap.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2016-2019 Sensus Slovensko a.s. +/// Copyright (c) 2016-2020 Sensus Slovensko a.s. /// using FluentNHibernate.Mapping; @@ -19,8 +19,9 @@ namespace Users.Mappings Map(x => x.Password4); Map(x => x.FullName).Column("Description"); Map(x => x.LastPwChange); - HasMany(x => x.Groups) - .Cascade.All(); + HasManyToMany(x => x.Groups) + .Cascade.SaveUpdate() + .Table("UsersGroups"); } } } diff --git a/Users/Properties/AssemblyInfo.cs b/Users/Properties/AssemblyInfo.cs index d6e645560..9d4494464 100644 --- a/Users/Properties/AssemblyInfo.cs +++ b/Users/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.24.1382.0")] -[assembly: AssemblyFileVersion("2.24.1382.0")] +[assembly: AssemblyVersion("2.25.1400.0")] +[assembly: AssemblyFileVersion("2.25.1400.0")]