Completed
Pull Request — master (#16)
by Simon
01:16
created

PartialFormSubmission::canCreate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace Firesphere\PartialUserforms\Models;
4
5
use SilverStripe\Control\Controller;
6
use SilverStripe\Control\Director;
7
use SilverStripe\Forms\FieldList;
8
use SilverStripe\Forms\GridField\GridField;
9
use SilverStripe\Forms\GridField\GridFieldButtonRow;
10
use SilverStripe\Forms\GridField\GridFieldConfig;
11
use SilverStripe\Forms\GridField\GridFieldDataColumns;
12
use SilverStripe\Forms\GridField\GridFieldExportButton;
13
use SilverStripe\Forms\GridField\GridFieldPrintButton;
14
<<<<<<< HEAD
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_SL
Loading history...
15
use SilverStripe\Forms\ReadonlyField;
16
use SilverStripe\ORM\DataList;
17
use SilverStripe\ORM\DataObject;
18
use SilverStripe\Security\Member;
19
use SilverStripe\Security\RandomGenerator;
20
=======
21
use SilverStripe\ORM\ArrayList;
22
use SilverStripe\ORM\DataList;
23
use SilverStripe\ORM\DataObject;
24
use SilverStripe\Security\Member;
25
>>>>>>> Safe files to partial submissions
26
use SilverStripe\UserForms\Model\Submission\SubmittedForm;
27
28
/**
29
 * Class \Firesphere\PartialUserforms\Models\PartialFormSubmission
30
 *
31
 * @property boolean $IsSend
32
 * @property int $UserDefinedFormID
33
 * @method DataObject UserDefinedForm()
34
 * @method DataList|PartialFieldSubmission[] PartialFields()
35
 * @method DataList|PartialFileFieldSubmission[] PartialUploads()
36
 */
37
class PartialFormSubmission extends SubmittedForm
38
{
39
    private static $table_name = 'PartialFormSubmission';
40
41
    private static $db = [
42
        'IsSend'    => 'Boolean(false)',
43
        'TokenSalt' => 'Varchar(16)',
44
        'Token'     => 'Varchar(16)',
45
    ];
46
47
    private static $has_one = [
48
        'UserDefinedForm' => DataObject::class
49
    ];
50
51
    private static $has_many = [
52
        'PartialFields'  => PartialFieldSubmission::class,
53
        'PartialUploads' => PartialFileFieldSubmission::class
54
    ];
55
56
    private static $cascade_deletes = [
57
        'PartialFields'
58
    ];
59
60
    /**
61
     * @var array
62
     */
63
    private static $summary_fields = [
64
        'ID'            => 'ID',
65
        'PartialLink'   => 'Link',
66
        'Created'       => 'Created',
67
        'LastEdited'    => 'Last Edited',
68
    ];
69
70
    public function getCMSFields()
71
    {
72
        /** @var FieldList $fields */
73
        $fields = parent::getCMSFields();
74
        $fields->removeByName(['Values', 'IsSend', 'PartialFields', 'TokenSalt', 'Token', 'UserDefinedFormID', 'Submitter']);
75
76
<<<<<<< HEAD
77
        $partialFields = GridField::create(
78
=======
79
        $partialFields = $this->PartialFields();
80
        $fileFields = $this->PartialUploads();
81
        $list = ArrayList::create();
82
        foreach ($partialFields as $field) {
83
            $list->push($field);
84
        }
85
        foreach ($fileFields as $field) {
86
            $list->push($field);
87
        }
88
        $values = GridField::create(
89
>>>>>>> Safe files to partial submissions
90
            'PartialFields',
91
            _t(static::class . '.PARTIALFIELDS', 'Partial fields'),
92
            $list->sort('Created', 'ASC')
93
        );
94
95
        $exportColumns =[
96
            'Title'       => 'Title',
97
            'ExportValue' => 'Value'
98
        ];
99
100
        $config = new GridFieldConfig();
101
        $config->addComponent(new GridFieldDataColumns());
102
        $config->addComponent(new GridFieldButtonRow('after'));
103
        $config->addComponent(new GridFieldExportButton('buttons-after-left', $exportColumns));
104
        $config->addComponent(new GridFieldPrintButton('buttons-after-left'));
105
        $partialFields->setConfig($config);
106
107
        $fields->addFieldsToTab(
108
            'Root.Main',
109
            [
110
                ReadonlyField::create('ReadonlyPartialLink', 'Partial Link', $this->getPartialLink()),
111
                $partialFields
112
            ]
113
        );
114
115
        return $fields;
116
    }
117
118
    public function getParent()
119
    {
120
        return $this->UserDefinedForm();
121
    }
122
123
    /**
124
     * @param Member
125
     *
126
     * @return boolean|string
127
     */
128
    public function canCreate($member = null, $context = [])
129
    {
130
        if ($this->UserDefinedForm()) {
131
            return $this->UserDefinedForm()->canCreate($member, $context);
132
        }
133
134
        return false;
135
    }
136
137
    /**
138
     * @param Member
139
     *
140
     * @return boolean|string
141
     */
142
    public function canView($member = null)
143
    {
144
        if ($this->UserDefinedForm()) {
145
            return $this->UserDefinedForm()->canView($member);
146
        }
147
148
        return false;
149
    }
150
151
    /**
152
     * @param Member
153
     *
154
     * @return boolean|string
155
     */
156
    public function canEdit($member = null)
157
    {
158
        if ($this->UserDefinedForm()) {
159
            return $this->UserDefinedForm()->canEdit($member);
160
        }
161
162
        return false;
163
    }
164
165
    /**
166
     * @param Member
167
     *
168
     * @return boolean|string
169
     */
170
    public function canDelete($member = null)
171
    {
172
        if ($this->UserDefinedForm()) {
173
            return $this->UserDefinedForm()->canDelete($member);
174
        }
175
176
        return parent::canDelete($member);
177
    }
178
179
    /**
180
     * Get the share link of the form
181
     *
182
     * @return string
183
     * @throws \Exception
184
     */
185
    public function getPartialLink()
186
    {
187
        if (!$this->isInDB()) {
188
            return '(none)';
189
        }
190
191
        $token = $this->getPartialToken();
192
193
        return Controller::join_links(
194
            Director::absoluteBaseURL(),
195
            'partial',
196
            $this->generateKey($token),
197
            $token
198
        );
199
    }
200
201
    /**
202
     * Get the unique token for the share link
203
     *
204
     * @return bool|string|null
205
     * @throws \Exception
206
     */
207
    protected function getPartialToken()
208
    {
209
        if (!$this->TokenSalt) {
210
            $this->TokenSalt = $this->generateToken();
211
            $this->Token = $this->generateToken();
212
            $this->write();
213
        }
214
215
        return $this->Token;
216
    }
217
218
    /**
219
     * Generate a new token
220
     *
221
     * @return bool|string
222
     * @throws \Exception
223
     */
224
    protected function generateToken()
225
    {
226
        $generator = new RandomGenerator();
227
228
        return substr($generator->randomToken('sha256'), 0, 16);
229
    }
230
231
    /**
232
     * Generate a key based on the share token salt
233
     *
234
     * @param string $token
235
     * @return mixed
236
     */
237
    public function generateKey($token)
238
    {
239
        return hash_pbkdf2('sha256', $token, $this->TokenSalt, 1000, 16);
240
    }
241
}
242