Changeset 823

Show
Ignore:
Timestamp:
07/14/08 16:47:15 (20 months ago)
Author:
mpaschal
Message:

First go at a LECF converter

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/LinkedEntryCustomFields/plugins/LinkedEntryCustomFields/lib/LinkedEntryCustomFields/App.pm

    r810 r823  
    188188} 
    189189 
     190sub convert_rf2cf { 
     191    my $app = shift; 
     192 
     193    # Look for RF field definitions. 
     194    my $def_iter = MT->model('plugindata')->load_iter({ plugin => 'rightfields' }); 
     195     
     196    my (@tags, @fields); 
     197    DEF: while (my $def = $def_iter->()) { 
     198        # Don't care about default settings, only the ones actually in use on blogs. 
     199        next DEF if $def->key !~ m{ \A blog_ }xms; 
     200        push @tags,   $def->clone if $def->key =~ m{ _tags \z }xms; 
     201        push @fields, $def->clone if $def->key =~ m{ _extra \z }xms; 
     202    } 
     203 
     204    my %tags_for_fields; 
     205    TAG: for my $tag_def (@tags) { 
     206        MT->log('OH HAI from tag ' . $tag_def->key); 
     207        $tag_def->key =~ m{ \A blog_(\d+) }xms or next TAG; 
     208        my $blog_id = $1; 
     209 
     210        # We don't know from the tag data what fields are entries, so record all of them. 
     211        my $tags_data = $tag_def->data; 
     212        for my $tag_data (@$tags_data) { 
     213            my ($field, $tag_name) = @{$tag_data}{qw( field tag )}; 
     214 
     215            # Each CF can have only one tag, and we'll need to pull them out by field. 
     216            $tags_for_fields{$blog_id}->{$field} = $tag_name; 
     217        } 
     218    } 
     219     
     220    my (%fields_for_blog, %fields_by_id, %datasource_for_blog); 
     221    FIELDS: for my $fields_def (@fields) { 
     222        MT->log('OH HAI from fieldset ' . $fields_def->key); 
     223        $fields_def->key =~ m{ \A blog_(\d+) }xms or next FIELDS; 
     224        my $blog_id = $1; 
     225         
     226 
     227            if $fields_def->data 
     228         
     229        my $fields_data = $fields_def->data; 
     230        $datasource_for_blog{$blog_id} = $fields_data->{datasource}; 
     231        my $fields = $fields_data->{cols}; 
     232        FIELD: while (my ($field_id, $field_data) = each %$fields) { 
     233            # Entry fields only. 
     234            next FIELD if !$field_data->{type} 
     235                || $field_data->{type} ne 'entry'; 
     236 
     237            my %field; 
     238            $field{$_} = $field_data->{$_} for qw( label weblog category_ids ); 
     239            $field{blog_id} = $blog_id; 
     240            $field{tag} = $tags_for_fields{$blog_id}->{$field_id}; 
     241             
     242            $fields_for_blog{$blog_id} ->{$field_id} = \%field; 
     243            $fields_by_id   {$field_id}->{$blog_id}  = \%field; 
     244        } 
     245    } 
     246     
     247    # Upgrade duplicates to global fields. 
     248    FIELD_BY_ID: while (my ($field_id, $fields) = each %fields_by_id) { 
     249        # Leave fields that are only in one blog alone. 
     250        next FIELD_BY_ID if 1 == scalar keys %$fields; 
     251         
     252        my ($first_field, @fields) = values %$fields; 
     253        for my $datum (qw( label weblog category_ids tag )) { 
     254            my $first_value = $first_field->{$datum}; 
     255            for my $next_field (@fields) { 
     256                my $next_value = $next_field->{$datum}; 
     257                next FIELD_BY_ID if  defined $first_value && !defined $next_value; 
     258                next FIELD_BY_ID if !defined $first_value &&  defined $next_value; 
     259                next FIELD_BY_ID if  defined $first_value 
     260                    && $first_value ne $next_value; 
     261            } 
     262        } 
     263         
     264        # Huh, everything matched. Make this a global field. 
     265        # TODO: Delete the value from each of their %fields_by_blog groups, using blog_id member. 
     266        # TODO: Assign first_field to blog_id=0 group. Or have a separate set of global fields? 
     267    } 
     268     
     269    # Make corresponding custom fields. 
     270    while (my ($blog_id, $fields) = each %fields_for_blog) { 
     271        while (my ($field_id, $field_data) = each %$fields) { 
     272            # Make or update the corresponding custom field. 
     273            my $cf = MT->model('field')->load({ 
     274                blog_id  => $blog_id, 
     275                basename => $field_id, 
     276            }); 
     277            $cf ||= MT->model('field')->new; 
     278             
     279            my $options = $field_data->{weblog}; 
     280            $options = join q{,}, $field_data->{category_ids} 
     281                if $field_data->{category_ids}; 
     282 
     283            $cf->set_values({ 
     284                name     => $field_data->{label}, 
     285                obj_type => 'entry', 
     286                type     => 'entry', 
     287                options  => $options, 
     288                basename => $field_id, 
     289            }); 
     290            $cf->blog_id($blog_id) if $blog_id;  # TODO: 0 = global? 
     291 
     292            my $tag = $field_data->{tag}; 
     293            $tag ||= lc join q{}, $cf->obj_type, 'data', $cf->name; 
     294            # TODO: ensure the tag is unique, since CF makes us. 
     295            $cf->tag($tag); 
     296 
     297            $cf->save or die $cf->errstr; 
     298             
     299            # Copy the data for that field. 
     300            my $datasource = $datasource_for_blog{$blog_id}; 
     301            if ($datasource eq '_pseudo') { 
     302                # omg pseudo objects aiee 
     303            } 
     304            else { 
     305                my $sql = MT::ObjectDriver::SQL->new; 
     306                $sql-> 
     307            } 
     308        } 
     309    } 
     310     
     311    # Start copying data. 
     312     
     313     
     314    return $app->return_to_dashboard( redirect => 1 ); 
     315} 
     316 
    1903171; 
    191318