Revision 310

Date:
2013/04/24 11:13:09
Author:
ahitrov
Revision Log:
Credentials:
SQL numeric field datatype
Facebook external fields from parent
User Profile: get_credentials
Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/plugins/users/lib/users/OA/FaceBook.pm

     
    3 3 use base "users::OA::Credential";
    4 4 use Contenido::Globals;
    5 5
    6 sub extra_properties
    7 {
    8 return (
    9 { 'attr' => 'name', 'type' => 'string', 'rusname' => 'Имя в системе' },
    10 { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус',
    11 'cases' => [
    12 [0, 'Не активен'],
    13 [1, 'Подтвержден'],
    14 [3, 'Потерян / заблокирован'],
    15 ],
    16 },
    17 )
    18 }
    19
    20 6 sub class_name
    21 7 {
    22 8 return 'OpenAuth FaceBook';
  • utf8/plugins/users/lib/users/UserProfile.pm

     
    13 13 'users::OA::Mailru' => 'mailru',
    14 14 );
    15 15
    16 my %CREDENTIAL_REVERSE = (
    17 'email' => 'users::Email',
    18 'phone' => 'users::Phone',
    19 'vkontakte' => 'users::OA::VK',
    20 'facebook' => 'users::OA::FaceBook',
    21 'google' => 'users::OA::Google',
    22 'mailru' => 'users::OA::Mailru',
    23 );
    24
    16 25 sub extra_properties
    17 26 {
    18 27 return (
     
    63 72
    64 73 return if exists $opts->{ids} || exists $opts{names} || exists $opts{light};
    65 74 if ( $self->id && $state->{users}->use_credentials ) {
    75 $self->{credentials_available} = {};
    66 76 my $creds = $keeper->get_documents(
    67 77 uid => $self->id,
    68 78 table => 'users::SQL::CredentialsTable',
     
    73 83 foreach my $cred ( @$creds ) {
    74 84 $cred->{keeper} = undef;
    75 85 my $main_field = $CREDENTIAL_FIELDS{$cred->class} if exists $CREDENTIAL_FIELDS{$cred->class};
    86 $self->{credentials_available}{$main_field} = 1;
    76 87 if ( $main_field ) {
    77 88 my $multi_field = $main_field.'s';
    78 89 $self->{$multi_field} = [] unless exists $self->{$multi_field};
     
    151 162 }
    152 163
    153 164
    165 sub get_credentials {
    166 my ($self, $name, %opts) = @_;
    167 my $objects;
    168 if ( $name ) {
    169 return undef unless exists $CREDENTIAL_REVERSE{$name};
    170 my $names = $name.'s';
    171 if ( exists $self->{credentials_available}{$name} ) {
    172 $objects = $self->{$names};
    173 }
    174 } elsif ( my @keys = keys %{$self->{credentials_available}} ) {
    175 $objects = {};
    176 foreach my $key ( @keys ) {
    177 my $names = $key.'s';
    178 push $objects->{$key} = $self->{$names};
    179 }
    180 }
    181 return $objects;
    182 }
    183
    154 184 sub confirm_credential {
    155 185 my ($self, %opts) = @_;
    156 186 my $object;
     
    191 221 ext_id => $opts{vkontakte},
    192 222 limit => 1,
    193 223 );
    224 return undef if ref $object && $object->uid != $self->id;
    194 225 unless ( ref $object ) {
    195 226 $object = users::OA::VK->new ($keeper);
    196 227 $object->name( $opts{name} );
     
    207 238 ext_id => $opts{facebook},
    208 239 limit => 1,
    209 240 );
    241 return undef if ref $object && $object->uid != $self->id;
    210 242 unless ( ref $object ) {
    211 243 $object = users::OA::FaceBook->new ($keeper);
    212 244 $object->name( $opts{name} );
     
    223 255 ext_id => $opts{google},
    224 256 limit => 1,
    225 257 );
    258 return undef if ref $object && $object->uid != $self->id;
    226 259 unless ( ref $object ) {
    227 260 $object = users::OA::Google->new ($keeper);
    228 261 $object->name( $opts{name} );
     
    243 276 ext_id => $opts{mailru},
    244 277 limit => 1,
    245 278 );
    279 return undef if ref $object && $object->uid != $self->id;
    246 280 unless ( ref $object ) {
    247 281 $object = users::OA::Mailru->new ($keeper);
    248 282 $object->name( $opts{name} );
     
    259 293 } elsif ( $opts{email} ) {
    260 294 ($object) = $self->keeper->get_documents(
    261 295 class => 'users::Email',
    262 uid => $self->id,
    263 296 name => lc($opts{email}),
    264 297 limit => 1,
    265 298 );
    299 return undef if ref $object && $object->uid != $self->id;
    266 300 unless ( ref $object ) {
    267 301 $object = users::Email->new ($keeper);
    268 302 $object->name( lc($opts{email}) );
     
    277 311 } elsif ( $opts{phone} ) {
    278 312 ($object) = $self->keeper->get_documents(
    279 313 class => 'users::Phone',
    280 uid => $self->id,
    281 314 name => $keeper->{users}->_phone_reduction( $opts{phone} ),
    282 315 limit => 1,
    283 316 );
    317 return undef if ref $object && $object->uid != $self->id;
    284 318 unless ( ref $object ) {
    285 319 $object = users::Phone->new ($keeper);
    286 320 $object->name( $keeper->{users}->_phone_reduction($opts{phone}) );
     
    348 382
    349 383 return 1;
    350 384 }
    385
    386
    387 sub post_delete
    388 {
    389 my $self = shift;
    390
    391 if ( $state->{users}->use_credentials ) {
    392 my $creds = $keeper->get_documents(
    393 table => 'users::SQL::CredentialsTable',
    394 uid => $self->id,
    395 return_mode => 'array_ref',
    396 );
    397 map { $_->delete( attachments => 1 ) } @$creds;
    398 }
    399 1;
    400 }
    401
    351 402 1;
  • utf8/plugins/users/sql/TOAST/credentials.sql

     
    7 7 status smallint not null default 0,
    8 8 opaque smallint not null default 0,
    9 9 uid integer not null default 0,
    10 ext_id integer not null default 0,
    10 ext_id numeric not null default 0,
    11 11 sections integer,
    12 12 name text,
    13 13 main integer,

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.