Document System Tutorial Part 11 - Document and Folder Permissions (Current Progress)

Back to Previous Page

Structure:

models

channel.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// Channel !
type Channel struct {
    uadmin.Model
    Name string `uadmin:"required"`
}

document_group.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// DocumentGroup !
type DocumentGroup struct {
    uadmin.Model
    Group      uadmin.UserGroup
    GroupID    uint
    Document   Document
    DocumentID uint
    Read       bool
    Add        bool
    Edit       bool
    Delete     bool
}

// DocumentGroup function that returns string value
func (d *DocumentGroup) String() string {

    // Gives access to the fields in another model
    uadmin.Preload(d)

    // Returns the GroupName from the Group model
    return d.Group.GroupName
}

document_user.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// DocumentUser !
type DocumentUser struct {
    uadmin.Model
    User       uadmin.User
    UserID     uint
    Document   Document
    DocumentID uint
    Read       bool
    Add        bool
    Edit       bool
    Delete     bool
}

// DocumentUser function that returns string value
func (d *DocumentUser) String() string {

    // Gives access to the fields in another model
    uadmin.Preload(d)

    // Returns the full name from the User model
    return d.User.String()
}

document_version.go

Back to Top

package models

import (
    "fmt"
    "time"

    "github.com/uadmin/uadmin"
)

// DocumentVersion !
type DocumentVersion struct {
    uadmin.Model
    Document   Document
    DocumentID uint
    File       string `uadmin:"file"`
    Number     int    `uadmin:"help:version number"`
    Date       time.Time
    Format     Format
}

// Returns the version number
func (d DocumentVersion) String() string {
    return fmt.Sprint(d.Number)
}

document.go

Back to Top

package models

import (
    "time"

    "github.com/uadmin/uadmin"
)

// Document !
type Document struct {
    uadmin.Model
    Name        string
    File        string `uadmin:"file"`
    Description string `uadmin:"html"`
    RawText     string `uadmin:"list_exclude"`
    Format      Format `uadmin:"list_exclude"`
    Folder      Folder `uadmin:"filter"`
    FolderID    uint
    CreatedDate time.Time
    Channel     Channel `uadmin:"list_exclude"`
    ChannelID   uint
    CreatedBy   string
}

// Save !
func (d *Document) Save() {
    // Initialized variables
    docChange := false
    newDoc := false
    // Checks whether the document record is new or existing
    if d.ID != 0 {
        // Initializes the Document model
        oldDoc := Document{}

        // Gets the ID of the old Document
        uadmin.Get(&oldDoc, "id = ?", d.ID)

        // Checks if the file is changed or updated
        if d.File != oldDoc.File {
            docChange = true
        }
    } else {
        // New document record
        docChange = true
        newDoc = true
    }

    // Save the document
    uadmin.Save(d)

    // Checks whether the document record has changed
    if docChange {
        // Prints the result
        uadmin.Trail(uadmin.DEBUG, "The document has changed.")

        // Sets the document value to the DocumentVersion
        ver := DocumentVersion{}
        ver.Date = time.Now()
        ver.DocumentID = d.ID
        ver.File = d.File
        ver.Format = d.Format

        // Counts the version number by DocumentID and increment it by 1
        ver.Number = uadmin.Count([]DocumentVersion{}, "document_id = ?", d.ID) + 1

        // Save the document version
        uadmin.Save(&ver)

        // Checks whether the document is a new record
        if newDoc {
            // Initializes the User model
            user := uadmin.User{}

            // Gets the username of the user to display in CreatedBy
            uadmin.Get(&user, "username = ?", d.CreatedBy)

            // Sets values to the DocumentUser model fields
            creator := DocumentUser{
                UserID:     user.ID,
                DocumentID: d.ID,
                Read:       true,
                Edit:       true,
                Add:        true,
                Delete:     true,
            }

            // Save the document user
            uadmin.Save(&creator)
        }
    }
}

// GetPermissions !
func (d Document) GetPermissions(user uadmin.User) (Read bool, Add bool, Edit bool, Delete bool) {
    // Check whether the user is an admin
    if user.Admin {
        // Set all permissions to true
        Read = true
        Add = true
        Edit = true
        Delete = true
    }

    // Since Folder is a foreign key to the Document model, we need to check
    // whether there is a Folder specified in the Document model.
    // We will check for folder permissions first
    // Then we will check for document permissions after that
    if d.FolderID != 0 {
        // Initialize the FolderGroup model
        folderGroup := FolderGroup{}

        // Get data by GroupID and FolderID
        uadmin.Get(&folderGroup, "group_id = ? AND folder_id = ?", user.UserGroupID, d.FolderID)

        // Check whether there is a FolderGroup recird
        if folderGroup.ID != 0 {
            // Assign FolderGroup permission values to the variables
            Read = folderGroup.Read
            Add = folderGroup.Add
            Edit = folderGroup.Edit
            Delete = folderGroup.Delete
        }

        // Initialize the FolderUser model
        folderUser := FolderUser{}

        // Get data by UserID and FolderID
        uadmin.Get(&folderUser, "user_id = ? AND folder_id = ?", user.ID, d.FolderID)

        // Check whether there is a FolderUser record
        if folderUser.ID != 0 {
            // Assign FolderUser permission values to the variables
            Read = folderUser.Read
            Add = folderUser.Add
            Edit = folderUser.Edit
            Delete = folderUser.Delete
        }
    }

    // Document Permissions
    // Initialize the DocumentGroup model
    documentGroup := DocumentGroup{}

    // Get data by GroupID and DocumentID
    uadmin.Get(&documentGroup, "group_id = ? AND document_id = ?", user.UserGroupID, d.ID)

    // Check whether there is a DocumentGroup record
    if documentGroup.ID != 0 {
        // Assign DocumentGroup permission values to the variables
        Read = documentGroup.Read
        Add = documentGroup.Add
        Edit = documentGroup.Edit
        Delete = documentGroup.Delete
    }

    // Initialize the DocumentUser model
    documentUser := DocumentUser{}

    // // Get data by UserID and DocumentID
    uadmin.Get(&documentUser, "user_id = ? AND document_id = ?", user.ID, d.ID)

    // Check whether there is a DocumentUser record
    if documentUser.ID != 0 {
        // Assign DocumentUser permission values to the variables
        Read = documentUser.Read
        Add = documentUser.Add
        Edit = documentUser.Edit
        Delete = documentUser.Delete
    }

    // Return Read, Add, Edit, and Delete values
    return
}

folder_group.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// FolderGroup !
type FolderGroup struct {
    uadmin.Model
    Group    uadmin.UserGroup
    GroupID  uint
    Folder   Folder
    FolderID uint
    Read     bool
    Add      bool
    Edit     bool
    Delete   bool
}

// FolderGroup function that returns string value
func (f *FolderGroup) String() string {

    // Gives access to the fields in another model
    uadmin.Preload(f)

    // Returns the GroupName from the Group model
    return f.Group.GroupName
}

folder_user.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// FolderUser !
type FolderUser struct {
    uadmin.Model
    User     uadmin.User
    UserID   uint
    Folder   Folder
    FolderID uint
    Read     bool
    Add      bool
    Edit     bool
    Delete   bool
}

// FolderUser function that returns string value
func (f *FolderUser) String() string {

    // Gives access to the fields in another model
    uadmin.Preload(f)

    // Returns the full name from the User model
    return f.User.String()
}

folder.go

Back to Top

package models

import (
    "github.com/uadmin/uadmin"
)

// Folder !
type Folder struct {
    uadmin.Model
    Name     string
    Parent   *Folder
    ParentID uint
}

format.go

Back to Top

package models

// Format is the name of the drop down list ...
type Format int

// PDF is the name of the drop down list value ...
func (Format) PDF() Format {
    return 1
}

// TXT is the name of the drop down list value ...
func (Format) TXT() Format {
    return 2
}

// Others is the name of the drop down list value ...
func (Format) Others() Format {
    return 3
}

main.go

Back to Top

package main

import (
    // Specify the username that you used inside github.com folder
    "github.com/username/document_system/models"
    "github.com/uadmin/uadmin"
)

func main() {
    // Register models to uAdmin
    uadmin.Register(
        models.Folder{},
        models.FolderGroup{},
        models.FolderUser{},
        models.Channel{},
        models.Document{},
        models.DocumentGroup{},
        models.DocumentUser{},
        models.DocumentVersion{},
    )

    // Register FolderGroup and FolderUser to Folder model
    uadmin.RegisterInlines(
        models.Folder{},
        map[string]string{
            "foldergroup": "FolderID",
            "folderuser":  "FolderID",
        },
    )

    // Register DocumentVersion, DocumentGroup, and DocumentUser to Document
    // model
    uadmin.RegisterInlines(
        models.Document{},
        map[string]string{
            "documentgroup":   "DocumentID",
            "documentuser":    "DocumentID",
            "documentversion": "DocumentID",
        },
    )

    // Assign Site Name value as "Document System"
    // NOTE: This code works only if database does not exist yet.
    uadmin.SiteName = "Document System"

    // Activates a uAdmin server
    uadmin.StartServer()
}

uadmin.db

Channels

Back to Top

../../../_images/channelmodelupdate.png

Documents

Back to Top

../../../_images/documentmodelupdate3.png

Document Groups

Back to Top

../../../_images/documentgroupmodelupdate.png

Document Users

Back to Top

../../../_images/documentusermodelupdate.png

Document Versions

Back to Top

../../../_images/documentversionmodelupdate3.png

Folder Groups

Back to Top

../../../_images/foldergroupmodelupdate.png

Folder Users

Back to Top

../../../_images/folderusermodelupdate.png

Folders

Back to Top

../../../_images/foldermodelupdate.png

Group Permissions

Back to Top

../../../_images/grouppermissionmodelupdate.png