Доступ к записям

Ситуация в следующем:
В администрировании создал Группы (Школы). Установил им определенные права, т.е. если Школа 1 добавила Студента 1, то Школа 2 не видит данного студента. Аналогично если Школа 2 добавила Студента 2, то Школа 1 не видит его. Примерно выглядит следующим образом:

1

Теперь на карточке дублей необходимо создать кнопку "Использовать найденного клиента". Описание:
Школа 1 добавила Студента 3 к себе. Теперь Студент 3 хочет учиться, помимо Школы 1, и в Школе 2. Школа 2 добавляет его к себе. Всплывает окно дублей о том что студент уже есть в базе. Суть кнопки в следующем: берется найденный студент и добавляется в Школу 2, но чтобы он был виден и Школе 1 и в Школе 2. Примерно отобразил следующем рисунке:

2

Как я понимаю необходимо в деталь "Доступ" (по найденному дублю записи) добавить запись с Группой (Школой). Встает встречный вопрос: как узнать Группу (Школу) в которой находится входящий в систему пользователь. Есть ли такая табличка с пользователем и соответствующей ему Группе (Школе)?

Нашел способ. Итак что я сделал:

В скрипте scr_SubjectDuplicates создал глобальную переменную

var DublFlag = 0;

На OnPrepare окна дублей добавил следующее

        var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;

        if (Sender.Name == 'wnd_ContactEdit') {
                DublContact = 1
        }

и на кнопку "Использовать найденного клиента"

function btnUseOnClick(Control) {
        if (DublContact == 1) {
                var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
                var Sender = Self.Attributes('DuplicatesProperties').NotifyObject;
                var ID = Self.Attributes('DuplicatesProperties').SubjectDataset.Values('ID');
                SetAttribute(Sender, 'IDRecord', ID);
                SetAttribute(Sender, 'IsDuble', true);
                btnUse.ModalResult = wmrCancel;
        }
}

Далее на кнопк Ок

function btnOKOnClick(Control) {
        var Dataset = dlData.Dataset;
        if (!CheckContactData(Dataset)) {
                return;
        }
        CheckName();
        CheckEmail();
        SetAttribute(Self, 'IDTo', dlData.Dataset.Values('ID'));
        scr_BaseDBEdit.btnOKOnClick(Control);
       
        // Если есть дубль но вызов функции
        var IsDuble = Self.Attributes('IsDuble');
        if (IsDuble == true) {  
                FillDublicatesValues();
                Self.Close();
        }

}

где в функции FillDublicatesValues()

взял Connector.CurrentUser.ContactID входящего.
Отфильтровал tbl_AdminUnit, поле UserContactID по Connector.CurrentUser.ContactID.
Взял ID

Отфильтровал tbl_UserInGroup, поле UserID по ID.
Взял все GroupID и вставил в tbl_ContactRight, т.е.

function FillDublicatesValues() {  
        var ID = Self.Attributes('IDRecord');
        var ds_Contact = Services.GetNewItemByUSI('ds_Contact');
        var DatasetTo = Services.GetNewItemByUSI('ds_Contact');
        var IDTo = Self.Attributes('IDTo');
       
        var ds_ContactRight = Services.GetNewItemByUSI('ds_ContactRight');
        ApplyDatasetFilter(ds_ContactRight, 'RecordID', ID, true)
        ds_ContactRight.Open();

                var IncomingUser = Connector.CurrentUser.ContactID;
                var ds_AdminUnit = Services.GetNewItemByUSI('ds_AdminUnit');
                ApplyDatasetFilter(ds_AdminUnit, 'UserContactID', IncomingUser, true);
                ds_AdminUnit.Open();
                var AdminUnitID = ds_AdminUnit.Values('ID');

                var ds_UserInGroup = Services.GetNewItemByUSI('ds_UserInGroup');
                ApplyDatasetFilter(ds_UserInGroup, 'UserID', AdminUnitID, true);
                ds_UserInGroup.Open();
                while (!ds_UserInGroup.IsEOF) {
                        var GroupID = ds_UserInGroup.Values('GroupID');
                       
                        while (!ds_ContactRight.IsEOF) {
                                if(ds_ContactRight.Values('AdminUnitID') != GroupID) {
                                        var IQ = Services.GetNewItemByUSI('iq_ContactRight');
                                        IQ.ColumnsValues.ItemsByName('ID').Value = Connector.GenGUID();
                                        IQ.ColumnsValues.ItemsByName('RecordID').Value = ID;
                                        IQ.ColumnsValues.ItemsByName('AdminUnitID').Value = GroupID;
                                        IQ.ColumnsValues.ItemsByName('CanRead').Value = true;
                                        IQ.ColumnsValues.ItemsByName('CanWrite').Value = true;
                                        IQ.ColumnsValues.ItemsByName('CanDelete').Value = false;
                                        IQ.ColumnsValues.ItemsByName('CanChangeAccess').Value = false;
                                        IQ.Execute();  
                                }
                                ds_ContactRight.GoToNext();
                        }
                        ds_UserInGroup.GoToNext();
                }
}

Думаю кому то в будущем пригодится!

Нравится

Поделиться

0 комментариев
Показать все комментарии